CORS vs Autofac vs Exception处理Owin中的中间件,哪一个先行?

时间:2018-02-02 16:29:26

标签: owin autofac startup owin-middleware

我有一个owin设置,在许多其他的东西,使用CORS和Autofac。 Autofac文档说“首先注册Autofac中间件。”,很多人说app.UseCors应该是第一件事。

我还有一个异常处理中间件,许多人也说这应该是第一件事,以便“其他中间件(在堆栈跟踪下)将传播并被此中间件的try / catch块捕获。”,和这个很有意义,因为实现看起来像:

        try
        {
            await Next.Invoke(context);
        }
        catch...

哪一个应该是第一个? 这3个中间件组件的正确顺序是什么

我当前的启动配置如下所示:

    public void Configuration(IAppBuilder app) {
        // Add WebApi CORS handling to the OWIN pipeline
        app.UseCors(CorsOptions.AllowAll);

        // Create and register Owin HttpConfig instance
        var config = new HttpConfiguration
        {
            IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always // Enable error details in http responses
        };

        // Register the Autofac middleware FIRST. This also adds Autofac-injected middleware
        // registered with the container.
        var container = AutofacConfig.ConfigureContainer(config);
        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);

        app.UseNLog();

        // Handle exceptions from OWIN middleware components globally
        app.UseExceptionHandling();

        app.UseOAuth(config);
        //... quite a bit more stuff after

1 个答案:

答案 0 :(得分:0)

我认为当文档说“#34;注册Autofac中间件第一个"它是在以下三个组件之间陈述正确顺序的上下文中:1)Autofac中间件,2)Autofac Web API中间件,以及3)标准Web API中间件。

CORS不是此列表的一部分,应首先进行配置:在调用.UseCors或使用请求的任何其他中间件之前,必须先调用.UseWebApi。任何中间件管理的任何请求都应包含CORS Access-Control标头,否则您可能会遇到跨源访问错误。我想这也适用于您的错误处理中间件。所以它应该在CORS之后配置(但在其他中间件组件之前,如果你想处理它们的异常)。

有关this page中CORS和Web API的更多信息。有关CORS详细信息here

的更多信息

事实上,确切的Autofac文档评论准确地说明了#14;注册Autofac中间件FIRST,然后是Autofac Web API中间件,最后是标准的Web API中间件"。在该文档的代码示例中,他们具有标准的web api设置代码,之后是OWIN web api设置(这是" First"适用的部分)。

public class Startup
{
  public void Configuration(IAppBuilder app)
  {
    var builder = new ContainerBuilder();

    // STANDARD WEB API SETUP:

    // Get your HttpConfiguration. In OWIN, you'll create one
    // rather than using GlobalConfiguration.
    var config = new HttpConfiguration();

    // Register your Web API controllers.
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

    // Run other optional steps, like registering filters,
    // per-controller-type services, etc., then set the dependency resolver
    // to be Autofac.
    var container = builder.Build();
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    // OWIN WEB API SETUP:

    // Register the Autofac middleware FIRST, then the Autofac Web API middleware,
    // and finally the standard Web API middleware.
    app.UseAutofacMiddleware(container);
    app.UseAutofacWebApi(config);
    app.UseWebApi(config);
  }
}

我获得代码示例的文档页面是here(我猜它与您检查的相同)。