将AddCors插入.Net Core的正确顺序是什么?

时间:2019-04-16 10:45:42

标签: c# asp.net-core cors

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

    services.AddMvc()
    services.AddCors();

很抱歉,上面提到了官方文档,但是我也看到了其他具有相反顺序的示例也可以正常工作。

  

您能否对内部原理一目了然?

2 个答案:

答案 0 :(得分: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之前调用。

答案 1 :(得分:2)

使用AddX()的服务

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

如果存在多个相同类型的服务注册,则该顺序实际上很重要,在这种情况下,最新的注册将获胜。默认框架部分通常不是以这种方式构建的。相反,它们实际上是以可以多次调用而不会出现问题的方式构建的。当您以后想要重新配置某些服务时,此功能特别有用。

对于AddMvc()AddCors(),这两种方法都将注册一组单独的服务,因此,比另一种方法更早调用实际上没有区别。

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

使用app.UseX()的中间件

middleware是在Configure中配置的,在那里注册每个中间件的顺序确实

中间件是按您注册顺序运行的链式管道:

Middleware pipeline

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

您也可以查看implementation of the CORS middleware。如您所见,对next()的调用就在它的末尾,这意味着CORS中间件的相关逻辑在执行下一个中间件之前就已运行。这是一个好信号,它需要首先运行。

所以正确的顺序是:

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

通常,MVC中间件几乎总是应该排在最后。