我开发了ASP.NET Core-5 Web,并在其中实现了Swagger:
startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddVersioning();
services.AddSwagger();
...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, IApiVersionDescriptionProvider provider,)
{
app.UseDeveloperExceptionPage();
app.UseStatusCodePagesWithReExecute("/errors/{0}");
app.UseVersionedSwagger(provider);
...
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller}/{action=Index}/{id?}");
});
}狂妄自大:
public static IServiceCollection AddVersioning(this IServiceCollection services)
{
services.AddApiVersioning(
options =>
{
options.ReportApiVersions = true;
});
services.AddVersionedApiExplorer(
options =>
{
options.GroupNameFormat = "'MyApp API v'VVV";
options.SubstituteApiVersionInUrl = true;
});
return services;
}
public static IServiceCollection AddSwagger(this IServiceCollection services)
{
services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
services.AddSwaggerGen(options =>
{
options.OperationFilter<SwaggerDefaultValues>();
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Scheme = "Bearer",
Description = @"JWT Authorization header using the Bearer scheme. <br><br>
Enter 'Bearer' [space] and then your token in the text input below.
<br><br>Example: 'Bearer 12345abcdef'",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http
});
options.OperationFilter<SwaggerAuthorizeCheckOperationFilter>();
// integrate xml comments
options.IncludeXmlComments(XmlCommentsFilePath);
});
return services;
}
public static IApplicationBuilder UseVersionedSwagger(this IApplicationBuilder app, IApiVersionDescriptionProvider provider)
{
app.UseSwagger();
app.UseSwaggerUI(
options =>
{
// build a swagger endpoint for each discovered API version
foreach (var description in provider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
}
});
return app;
}在本地系统上一切正常,但是当我部署到远程服务器上的IIS时。
然后我试着测试:
给予:
未找到网址:https://localhost:8443/myapp/的网页
而
给予:
我发现了一个错误:
获取错误未定义/swagger/MyApp v1/swagger.json
我该怎么解决这个问题?
谢谢
发布于 2021-12-27 02:50:27
尝试在startup.cs文件中的配置方法中添加以下代码:
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger(c =>
{
c.RouteTemplate = "/swagger/{documentName}/swagger.json";
});
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"));
}然后在ConfigureServices方法中添加以下代码:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});这里使用RouteTemplate,它和SwaggerEndpoint字符串之间的区别。一个使用{documentName},另一个使用"v1“作为文本。
具体参考文件:
https://stackoverflow.com/questions/70471540
复制相似问题