【问题标题】:What is the process that makes IIS start responding to requests through the Owin pipeline?使 IIS 开始通过 Owin 管道响应请求的过程是什么?
【发布时间】:2014-10-07 07:53:43
【问题描述】:

如果您在 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 来更改处理请求的方式?

【问题讨论】:

    标签: c# asp.net iis owin katana


    【解决方案1】:

    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

    【讨论】:

      【解决方案2】:

      从 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 接管并进入 OwinBuilderOwinAppContext 流,在其中查找 Startup 类调用Configuration 方法的程序集。

      【讨论】:

        猜你喜欢
        • 2014-08-31
        • 2019-05-15
        • 2013-08-20
        • 1970-01-01
        • 2019-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多