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

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

添加具有配置(IAppBuilder应用程序)方法的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方法。

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

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

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

只需要使用PreApplicationStartMethodAttribute标记它

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

 public static class PreApplicationStart { private const string TraceName = "Microsoft.Owin.Host.SystemWeb.PreApplicationStart"; ///  /// Registers the OWIN request processing module. ///  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接管并进入OwinBuilderOwinAppContext流,它们在程序 集中查找Startup类以调用Configuration方法。

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

在IIS集成管道中查看OWIN中间件虽然OWIN中间件组件(OMC)主要设计为在服务器无关的管道中运行,但也可以在IIS集成管道中运行OMC(不支持经典模式)。 通过从程序包管理器控制台(PMC)安装以下程序包,可以使OMC在IIS集成管道中工作:Install-Package Microsoft.Owin.Host.SystemWeb