使IIS通过Owin管道开始响应请求的过程是什么?

时间:2014-08-13 19:49:07

标签: c# asp.net iis owin katana

如果在Visual Studio 2013中创建一个空的ASP.NET Web应用程序项目,请打开包管理器控制台并安装包Microsoft.Owin.Host.SystemWeb

使用Configuration(IAppBuilder app)方法添加Startup类,例如:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Run(context => context.Response.WriteAsync("hello"));
    }
}

然后运行,你会看到hello出现在浏览器中。但是,你看一下这个项目,没有任何文件的变化,即web.config,它表明正在使用Owin管道。更重要的是,如果你有Startup类但没有安装Microsoft.Owin.Host.SystemWeb包,则不会运行Startup的Configuration方法。

我怀疑有一个自定义模块和处理程序参与实现所有这些,但找不到任何关于它的文档。我能够找到的唯一能够轻易触及这个主题的是this

如何通过引用一些dll来改变处理请求的方式?

2 个答案:

答案 0 :(得分:8)

从ASP.NET 4开始,您现在可以在代码中定义一个自定义类(引用的DLL或源代码),具有特定的约定,并在管道的早期由ASP.NET系统调用。

只需要使用PreApplicationStartMethodAttribute

进行标记即可

Microsoft.Owin.Host.SystemWeb程序集使用了这个功能,如果我们反思代码,我们可以看到这个启动方法注册了Owin模块:

public static class PreApplicationStart
{
    private const string TraceName = "Microsoft.Owin.Host.SystemWeb.PreApplicationStart";

    /// <summary>
    /// Registers the OWIN request processing module.
    /// </summary>
    public static void Initialize()
    {
        try
        {
            if (OwinBuilder.IsAutomaticAppStartupEnabled)
            {
                HttpApplication.RegisterModule(typeof(OwinHttpModule));
            }
        }
        catch (Exception exception1)
        {
            Exception exception = exception1;
            ITrace trace = TraceFactory.Create("Microsoft.Owin.Host.SystemWeb.PreApplicationStart");
            trace.WriteError(Resources.Trace_RegisterModuleException, exception);
            throw;
        }
    }
}

从那时起, OwinHttpModule 接管并进入 OwinBuilder OwinAppContext 流程,查找Startup程序集中的类调用Configuration方法。

答案 1 :(得分:5)

Microsoft.Owin.Host.SystemWeb订阅PreApplicationStart事件。当这个事件触发时,我们注册一个HttpModule,它包含检测Startup类和构建OWIN管道等的所有逻辑。

参见OWIN Middleware in the IIS integrated pipeline 尽管OWIN中间件组件(OMC)主要设计为在与服务器无关的管道中运行,但也可以在IIS集成管道中运行OMC(不支持经典模式)。通过从程序包管理器控制台(PMC)安装以下程序包,可以使OMC在IIS集成管道中工作:    安装包Microsoft.Owin.Host.SystemWeb

相关问题