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

  • 相关阅读:
    Shell脚本编程基础之程序
    从入门到放弃
    Shell编写的俄罗斯方块游戏(亲测可用)
    Qt开发环境搭建
    day01
    day01
    浅析STM32内部FLASH读写
    基于STM32 的485通讯实验(f103)
    八、Servlet的常见错误总结:
    七、Servlet介绍
  • 原文地址:https://www.cnblogs.com/lztkdr/p/14312409.html
Copyright © 2011-2022 走看看