第一个MVC中间件或Cors中间件。
services.AddMvc()
services.AddCors();
很抱歉,上面提到了官方文档,但是我也看到了其他具有相反顺序的示例也可以正常工作。
您能否对内部原理一目了然?
答案 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)
在ConfigureServices
中注册服务时,调用AddX()
方法的顺序通常无关紧要。因此,您可以按照最有意义的方式对它们进行排序和逻辑分组。
如果存在多个相同类型的服务注册,则该顺序实际上很重要,在这种情况下,最新的注册将获胜。默认框架部分通常不是以这种方式构建的。相反,它们实际上是以可以多次调用而不会出现问题的方式构建的。当您以后想要重新配置某些服务时,此功能特别有用。
对于AddMvc()
和AddCors()
,这两种方法都将注册一组单独的服务,因此,比另一种方法更早调用实际上没有区别。
请注意,AddMvc()
和AddCors()
均未设置任何中间件。他们只是准备中间件运行所需的必要服务。中间件是在Configure
方法内部配置的。
app.UseX()
的中间件 middleware是在Configure
中配置的,在那里注册每个中间件的顺序确实。
中间件是按您注册顺序运行的链式管道:
为了使一个中间件影响另一种中间件,它将需要在另一种中间件周围执行。因此,在您的情况下,由于要为MVC中间件启用CORS,以便可以从其他来源正确请求MVC中的路由,因此需要在MVC中间件之前注册CORS中间件。 / p>
您也可以查看implementation of the CORS middleware。如您所见,对next()
的调用就在它的末尾,这意味着CORS中间件的相关逻辑在执行下一个中间件之前就已运行。这是一个好信号,它需要首先运行。
所以正确的顺序是:
app.UseCors();
app.UseMvc();
通常,MVC中间件几乎总是应该排在最后。