【问题标题】:What is correct order to AddCors into .Net Core?AddCors 到 .Net Core 的正确顺序是什么?
【发布时间】:2019-09-06 10:46:02
【问题描述】:

第一个 MVC 中间件或 Cors 中间件。

    services.AddMvc()
    services.AddCors();

对不起,官方文档在上面提到了,但是我已经看到其他逆序的例子也可以正常工作。

您能否分享一下内部工作原理?

【问题讨论】:

    标签: c# asp.net-core cors


    【解决方案1】:

    使用 AddX() 的服务

    ConfigureServices 中注册服务时,调用AddX() 方法的顺序通常无关紧要。因此,您可以按照对您最有意义的方式对它们进行排序和逻辑分组。

    如果有多个相同类型的服务注册,则顺序实际上很重要的唯一方法,在这种情况下,最新的注册将获胜。默认框架部分通常不是以这种方式构建的。相反,它们实际上是以一种可以毫无问题地多次调用的方式构建的。当您想稍后重新配置某些服务时,这尤其有用。

    对于AddMvc()AddCors(),这两个方法都会注册一组单独的服务,所以在调用之前调用一个确实没有区别。

    请注意,AddMvc()AddCors() 都没有实际设置任何中间件。他们只是准备中间件运行所需的必要服务。中间件在Configure 方法内部配置。

    中间件使用app.UseX()

    middleware 配置在 Configure 中,并且在那里您注册每个中间件的顺序确实很重要。

    中间件是一个链式管道,按照您注册它的顺序运行:

    为了让一个中间件影响另一个中间件,它需要围绕另一个中间件执行。因此,在您的情况下,由于您希望为 MVC 中间件启用 CORS,以便您可以从其他来源正确请求 MVC 内的路由,您需要在 MVC 中间件之前注册 CORS 中间件

    您也可以查看implementation of the CORS middleware。如您所见,对next() 的调用位于它的最后,这意味着CORS 中间件的相关逻辑在执行下一个中间件之前运行。这是一个好兆头,它需要先运行。

    所以正确的顺序是:

    app.UseCors();
    app.UseMvc();
    

    作为一般规则,MVC 中间件几乎总是应该排在最后。

    【讨论】:

    • 我曾要求services.AddMvc() services.AddCors();,但感谢您解释app.UseCors(); app.UseMvc(); 拇指规则As a general rule, the MVC middleware almost always should come last. 是否适用于app.Use***services.Add***
    • 简而言之,请使用*** order 事项或 Add*** 事项用于中间件执行/配置。
    • @Abhijeet 哦,抱歉,我完全错过了那部分,因为您在问题中谈论的是“中间件”。 – 我在答案中添加了一部分,明确讨论了服务注册:)
    【解决方案2】:

    不,是相反的。您应该先添加 CORS 中间件,然后再添加 MVC 中间件,如下所示。示例取自Enable Cross-Origin Requests (CORS) in ASP.NET Core

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy(MyAllowSpecificOrigins,
            builder =>
            {
                builder.WithOrigins("http://example.com",
                                    "http://www.contoso.com");
            });
        });
    
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    } 
    

    使用时也是如此

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseCors(MyAllowSpecificOrigins); 
        app.UseMvc();
    }
    

    如果您阅读链接的文档,它会清楚地说明

    注意:

    UseCors 必须在UseMvc 之前调用。

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 2012-04-13
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-05
      • 1970-01-01
      • 2019-06-08
      相关资源
      最近更新 更多