什么是使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接管并进入OwinBuilder和OwinAppContext流,它们在程序 集中查找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