首页 > 代码库 > Owin Middleware如何在IIS集成管道中执行
Owin Middleware如何在IIS集成管道中执行
Owin Middleware Components(OMCs)
通过安装Install-Package Microsoft.Owin.Host.SystemWeb
可以让OMCs在IIS集成管道下工作
在IIS集成管道里,这个request pipeline 包含HttpModules关联到一组预定义的管道事件,例如
BeginRequest, AuthenticateRequest, AuthorizeRequest,等
如果我们将OMC和HttpModule进行比较,OMC也和HttpModule一样,必须要被注册到一个恰当的预定义的管道事件里,比如下面的这个Httpmodule,
当一个请求来到AuthenticateRequest阶段时,MyModule
会被调用
public class MyModule : IHttpModule{ public void Dispose() { //clean-up code here. } public void Init(HttpApplication context) { // An example of how you can handle AuthenticateRequest events. context.AuthenticateRequest += ctx_AuthRequest; } void ctx_AuthRequest(object sender, EventArgs e) { // Handle event. }}
为了使OMC取参与和HttpModule相同的基于事件的执行顺序,Katana运行时代码扫描Startup配置,并且把每个OMC关联到某个集成管道事件里,
比如下面的配置:
using System;using System.Threading.Tasks;using Microsoft.Owin;using Owin;using System.Web;using System.IO;using Microsoft.Owin.Extensions;[assembly: OwinStartup(typeof(owin2.Startup))]namespace owin2{ public class Startup { public void Configuration(IAppBuilder app) { app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "Middleware 1"); return next.Invoke(); }); app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "2nd MW"); return next.Invoke(); }); app.Run(context => { PrintCurrentIntegratedPipelineStage(context, "3rd MW"); return context.Response.WriteAsync("Hello world"); }); } private void PrintCurrentIntegratedPipelineStage(IOwinContext context, string msg) { var currentIntegratedpipelineStage = HttpContext.Current.CurrentNotification; context.Get<TextWriter>("host.TraceOutput").WriteLine( "Current IIS event: " + currentIntegratedpipelineStage + " Msg: " + msg); } }}
输出如下:
Current IIS event: PreExecuteRequestHandler Msg: Middleware 1Current IIS event: PreExecuteRequestHandler Msg: 2nd MWCurrent IIS event: PreExecuteRequestHandler Msg: 3rd MW
可以看到Katana运行时默认映射每个OMC到IIS管道事件PreRequestHandlerExecute
你可以根据需要调整这个OMC和管道事件的这种默认关系,具体使用一个扩展方法IAppBuilder UseStageMarker(),
像下面这样:
public void Configuration(IAppBuilder app){ app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "Middleware 1"); return next.Invoke(); }); app.Use((context, next) => { PrintCurrentIntegratedPipelineStage(context, "2nd MW"); return next.Invoke(); }); app.UseStageMarker(PipelineStage.Authenticate); app.Run(context => { PrintCurrentIntegratedPipelineStage(context, "3rd MW"); return context.Response.WriteAsync("Hello world"); }); app.UseStageMarker(PipelineStage.ResolveCache);}
输出如下:
Current IIS event: AuthenticateRequest Msg: Middleware 1Current IIS event: AuthenticateRequest Msg: 2nd MWCurrent IIS event: ResolveRequestCache Msg: 3rd MW
https://docs.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-middleware-in-the-iis-integrated-pipeline
Owin Middleware如何在IIS集成管道中执行