使用 SwaggerUI 和 nSwag 通过接受标头调用版本化端点

问题描述 投票:0回答:1

我有一个使用版本化端点的 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 以在媒体类型下拉列表中包含版本号,以便我可以指定正确的版本?

asp.net-core-webapi swagger-ui nswag
1个回答
0
投票

这是测试结果;

让我分享一下我的测试项目结构。

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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.