AddCors 到 .Net Core 的正确顺序是啥?

Posted

技术标签:

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

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

    services.AddMvc()
    services.AddCors();

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

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

【问题讨论】:

【参考方案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 之前调用。

【讨论】:

以上是关于AddCors 到 .Net Core 的正确顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

配置 ASP.NET Core 应用程序的正确顺序是啥?

.Net Core 仅在上传文件时被 CORS 策略错误阻止

仅在文件上传中出现 Asp.Net Core API CORS 策略错误

.net core多个重复任务执行顺序

我需要在 asp.net Core 中创建 XSRF 中间件吗?

.Net core2 CORS - SetIsOriginAllowed 如何工作?