• 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 是我项目中的封装的一个静态属性的类,大家可以根据自己情况做相应处理。

  • 相关阅读:
    sql语句的优化分析
    log4net.config
    redis lua 脚本实例
    Lua 脚本
    ServiceStack.Redis之IRedisClient<第三篇>
    有关Redis的Add和Set方法的比较
    如何在自己网站加上视频直播功能(搭建视频直播网站)
    带进度条的上传插件
    YII获取当前URL
    MYSQL常用命令
  • 原文地址:https://www.cnblogs.com/lztkdr/p/14312409.html
Copyright © 2020-2023  润新知