c# - 无法解析“Swashbuckle.AspNetCore.Swagger.ISwaggerProvider”类型的服务
问题描述
我正在启动一个新的Core
Web API,并希望添加Swagger
到我的应用程序中。
我现在的环境:
- .Net Core 3.0
- Swashbuckle.AspNetCore 5.0.0-rc4
这是我的Startup.cs
课程和配置:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//AK: Enable CORS
//CORS should be configured on host server.
services.AddCors(setupAction =>
{
setupAction.AddPolicy(DevCorsPolicyName,
builder =>
{
builder.WithOrigins("*").AllowAnyHeader().AllowAnyMethod();
});
});
#region Configuration
//Configuration File
services.Configure<AppSettingConfiguration>(Configuration.GetSection("AppSettings"));
//AutoMapper
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
//Configure Swagger
services.ConfigureSwaggerGen(c =>
{
c.SwaggerDoc("v3", new OpenApiInfo
{
Title = "GTrackAPI",
Version = "v3"
});
});
#endregion
#region Dependency Injection
//Database context and repository
services.AddDbContext<IGTrackContext, GTrackContext>(builder =>
{
builder.UseSqlServer(connectionString: Configuration.GetConnectionString("gtrackConnection"), sqlServerOptionsAction: null);
});
services.AddScoped<IGTrackRepository, GTrackRepository>();
//facade layers
services.AddScoped<IPersonFacade, PersonFacade>();
//Service layers
services.AddScoped<IPersonService, PersonService>();
#endregion
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//Enable development environment only settings
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//AK: Only allow all origins for development environmnet
app.UseCors(DevCorsPolicyName);
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "GTrackAPI");
c.RoutePrefix = string.Empty; //Configures swagger to load at application root
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
当我运行我的应用程序时,我收到以下错误:
InvalidOperationException:尝试调用中间件“Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware”时,无法解析“Swashbuckle.AspNetCore.Swagger.ISwaggerProvider”类型的服务。
这是Stacktrace
:
System.InvalidOperationException:尝试调用中间件“Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware”时,无法解析“Swashbuckle.AspNetCore.Swagger.ISwaggerProvider”类型的服务。在 Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.GetService(IServiceProvider sp, Type type, Type middleware) 在 lambda_method(Closure , Object , HttpContext , IServiceProvider ) 在 Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass4_1.b__2(HttpContext context) 在Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.Invoke(HttpContext context, ICorsPolicyProvider corsPolicyProvider) 在 Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass4_1.b__2(HttpContext context) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware。
很明显,我在这里遗漏了一些东西,不确定到底是什么。任何帮助,将不胜感激。
解决方案
打电话给
services.AddSwaggerGen();
中似乎缺少ConfigureServices
。
public static IServiceCollection AddSwaggerGen(
this IServiceCollection services,
Action<SwaggerGenOptions> setupAction = null)
{
// Add Mvc convention to ensure ApiExplorer is enabled for all actions
services.Configure<MvcOptions>(c =>
c.Conventions.Add(new SwaggerApplicationConvention()));
// Register generator and it's dependencies
services.AddTransient<ISwaggerProvider, SwaggerGenerator>();
services.AddTransient<ISchemaGenerator, SchemaGenerator>();
services.AddTransient<IApiModelResolver, JsonApiModelResolver>();
// Register custom configurators that assign values from SwaggerGenOptions (i.e. high level config)
// to the service-specific options (i.e. lower-level config)
services.AddTransient<IConfigureOptions<SwaggerGeneratorOptions>, ConfigureSwaggerGeneratorOptions>();
services.AddTransient<IConfigureOptions<SchemaGeneratorOptions>, ConfigureSchemaGeneratorOptions>();
// Used by the <c>dotnet-getdocument</c> tool from the Microsoft.Extensions.ApiDescription.Server package.
services.TryAddSingleton<IDocumentProvider, DocumentProvider>();
if (setupAction != null) services.ConfigureSwaggerGen(setupAction);
return services;
}
这就是添加ISwaggerProvider
到服务集合的原因
您可以将当前代码重构为
//...
//Configure Swagger
services.AddSwaggerGen(c => { //<-- NOTE 'Add' instead of 'Configure'
c.SwaggerDoc("v3", new OpenApiInfo {
Title = "GTrackAPI",
Version = "v3"
});
});
//...
正如源代码所见,最终将ConfigureSwaggerGen
使用 setup 操作调用。
推荐阅读
- java - 如何使用 Java 清除 Excel 过滤器
- python - AttributeError:部分初始化的模块“speech_recognition”没有属性“Recognizer”(很可能是由于循环导入)
- android - 使用 ViewBinding 测试片段场景
- android - 构建签名的 apk 时出错。错误是“密钥库被篡改,或密码不正确”
- c# - 如果反序列化失败,则跳过 Cosmos DB 容器中的文档
- javascript - 新事件()与 document.createEvent()
- python - 如何从熊猫数据框输出中删除“[]”
- c# - 如何解决必须在 Xamarin 的主线程上调用权限请求?
- testing - 如何使用“deployment_status”小猫并且仅在 QAS 分支上运行 Github Actions?
- javascript - 如何写入数据以异步提供/注入?