AddMvc/AddSwaggerGen和UseMvc/UseSwagger(UI)之间的顺序

Kon*_*ten 5 c# swagger asp.net-core asp.net-core-2.2 swagger-3.0

当我用Swagger为我的API供电时,我遵循其中一个guid并且我总是在Swagger注射之前进行MVC注射.

services.AddMvc();
services.AddSwaggerGen(_ => { ... });

app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c => { ... });
Run Code Online (Sandbox Code Playgroud)

我的一个朋友问我为什么要应用那个命令而不是在MVC之前先处理Swagger相关的行.我发现我无法向他解释这一点,也没有激励它(除了一个非常尴尬的井......这就是它的方式......).这告诉我,我应该深入研究一下这个问题.

在我注意到的时候,短暂的谷歌搜索显示没有任何相关性,所以我在这里问.

Nko*_*osi 7

在这种特殊情况下,Add*不受它们添加到服务集合的顺序的影响.

但是,根据特定Add*扩展的实现,订单可能会影响配置.例如,如果在内部使用TryAdd*扩展,则只有第一个调用寄存器.随后的调用将不会添加,因为注册已经存在.

一般AddScoped/AddSingleton/AddTransient调用识别最后一次调用类型,因为它会覆盖该类型的先前注册调用.当为一个类型注册多个实现时,为了解析via,IEnumerable<T>那么集合中的实现将按照它们注册的顺序.

ASP.NET Core中的引用依赖注入

对于Use*中间件,它们被添加到管道的顺序很重要,因为它们以相同的顺序调用.

订购

Startup.Configure方法中添加中间件组件的顺序定义了在请求上调用中间件组件的顺序以及响应的相反顺序.该顺序对于安全性,性能和功能至关重要.

参考ASP.NET核心中间件

根据我的经验,根据其设计目的,需要访问管道的一些第三方集成(包括招摇)建议在AddMvc尝试之后添加其扩展以避免路由冲突.

大多数安全性(身份验证/授权)和日志记录中间件通常建议在管道的早期添加,因此它们往往会出现AddMvc.