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 的正确顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章
.Net Core 仅在上传文件时被 CORS 策略错误阻止
仅在文件上传中出现 Asp.Net Core API CORS 策略错误