我有一个使用版本化端点的 ASP.NET Core 6.0 Web 应用程序。我选择使用
MediaTypeApiVersionReader
,这意味着 api 版本在请求的接受标头中传递。
我使用 nSwag v13.19.0 作为 Swagger 管道,并使用 SwaggerUI 来渲染 swagger UI。
swagger UI 页面正在呈现我的 API 的两个版本,但 swagger UI 上的 MediaType 下拉列表不包含所选版本。 。
由于缺少版本信息,swagger UI 始终执行端点的默认版本。
如何配置 Nswag 以在媒体类型下拉列表中包含版本号,以便我可以指定正确的版本?
这是测试结果;
让我分享一下我的测试项目结构。
CustomMediaTypeProcessor.cs 文件
using NSwag.Generation.Processors.Contexts;
using NSwag.Generation.Processors;
namespace WebApplication1
{
public class CustomMediaTypeProcessor : IOperationProcessor
{
public bool Process(OperationProcessorContext context)
{
foreach (var response in context.OperationDescription.Operation.Responses.Values)
{
foreach (var mediaType in response.Content.Keys.ToList())
{
if (mediaType == "application/json")
{
response.Content[$"application/json;Version={context.Document.Info.Version}"] = response.Content[mediaType];
response.Content.Remove(mediaType);
}
}
}
return true;
}
}
}
程序.cs
using System.Reflection.Metadata;
namespace WebApplication1
{
public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
builder.Services.AddOpenApiDocument(config =>
{
//// Other configuration
config.OperationProcessors.Add(new CustomMediaTypeProcessor()); // Register the custom processor
config.PostProcess = document =>
{
document.Info.Version = "v1";
document.Info.Title = "Title ";
document.Info.Description = "API ";
document.Info.TermsOfService = "None";
};
});
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
// Add OpenAPI 3.0 document serving middleware
// Available at: http://localhost:<port>/swagger/v1/swagger.json
app.UseOpenApi();
// Add web UIs to interact with the document
// Available at: http://localhost:<port>/swagger
app.UseSwaggerUi3();
}
// Configure the HTTP request pipeline.
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
}
}
}