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

  • 相关阅读:
    0X01 OWASP WebGoat Splitting
    subprocess
    Python中getopt()函数的使用
    Python3_UDP客户端
    Python3编写TCP客户端
    Python3---pymysql库____操作数据库
    review——database (1)CH8-Relational Database Design
    删除的review——数据库 (1)CH6关系数据理论
    review——C# (15)转换
    review——C# (14)接口
  • 原文地址:https://www.cnblogs.com/lztkdr/p/14312409.html
Copyright © 2011-2022 走看看