webapi Swagger 配置 services.BuildServiceProvider() 报警 ASP0000 问题处理
问题起源
网上的常见配置 Swagger 配置 在Startup类的 ConfigureServices 使用 services.BuildServiceProvider() ,其中有段代码如下:
var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
会报 ASP0000,大致意思是:从应用程序代码调用"BuildServiceProvider"会导致正在创建的单个服务的额外副本。将依赖项注入服务等替代方法视为"配置"的参数。详细解释
大概意思明了了,那如何处理呢?
处理方法
原代码示例
services.AddSwaggerGen(options =>
{
options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
var provider = services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
// 添加文档信息
foreach (var item in provider.ApiVersionDescriptions)
{
// 添加文档信息
options.SwaggerDoc(item.GroupName, new OpenApiInfo
{
Version = item.ApiVersion.ToString(),
Title = Config.SiteInfo.ApiSiteName,
Description = Config.SiteInfo.ApiSiteDesc,
Contact = new OpenApiContact
{
Name = Config.SiteInfo.ApiContactName,
Email = Config.SiteInfo.ApiContactEmail,
}
});
}
//需要设置api的项目属性,生成中输出xml文件
var xmlPath = Path.Combine(AppContext.BaseDirectory, $"{AppDomain.CurrentDomain.FriendlyName}.xml");
options.IncludeXmlComments(xmlPath);
});
修改后的代码
services.AddSwaggerGen();
services.AddOptions<SwaggerGenOptions>()
.Configure<IApiVersionDescriptionProvider>((options, service) =>
{
options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
// 添加文档信息
foreach (var item in service.ApiVersionDescriptions)
{
// 添加文档信息
options.SwaggerDoc(item.GroupName, new OpenApiInfo
{
Version = item.ApiVersion.ToString(),
Title = Config.SiteInfo.ApiSiteName,
Description = Config.SiteInfo.ApiSiteDesc,
Contact = new OpenApiContact
{
Name = Config.SiteInfo.ApiContactName,
Email = Config.SiteInfo.ApiContactEmail,
}
});
}
//需要设置api的项目属性,生成中输出xml文件
var xmlPath = Path.Combine(AppContext.BaseDirectory, $"{AppDomain.CurrentDomain.FriendlyName}.xml");
options.IncludeXmlComments(xmlPath);
});
注意
Config.SiteInfo 是我项目中的封装的一个静态属性的类,大家可以根据自己情况做相应处理。