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

Abh*_*eet 1 c# cors asp.net-core

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

    services.AddMvc()
    services.AddCors();
Run Code Online (Sandbox Code Playgroud)

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

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

pok*_*oke 5

使用AddX()的服务

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

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

对于AddMvc()AddCors(),这两种方法都将注册一组单独的服务,因此在调用一个方法之前比调用另一个方法确实没有区别。

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

中间件使用 app.UseX()

中间件在配置Configure有在您注册的每个中间件的顺序的事情。

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

中间件管道

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

您还可以看一下CORS中间件实现。如您所见next(),对它的调用位于其末尾,因此这意味着CORS中间件的相关逻辑在执行下一个中间件之前就已运行。这是一个好消息,它需要首先运行。

因此正确的顺序是:

app.UseCors();
app.UseMvc();
Run Code Online (Sandbox Code Playgroud)

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