Owin Middleware如何在IIS集成管道中执行

Posted LittleFeiHu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 1
Current IIS event: PreExecuteRequestHandler Msg: 2nd MW
Current 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 1
Current IIS event: AuthenticateRequest Msg: 2nd MW
Current 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集成管道中执行的主要内容,如果未能解决你的问题,请参考以下文章

Owin 学习系列1. 第一个 Owin 程序

Owin/Katana - 与 ASP.NET 请求生命周期集成

如何让 Umbraco 处理对非 .aspx 文件的请求(IIS 集成管道模式)?

IIS经典模式VS集成模式

OWIN的理解和实践 –Middleware开发入门

ASP.NET Core中Middleware的使用