ASP.NET Core 3.0 / Swashbuckle:全局限制响应内容类型

Chr*_*lin 5 c# swashbuckle asp.net-core asp.net-core-3.0

这与How do I set or remove the Default Response Content Type Using SwashBuckle基本相同,但对于 .NET Core 3.0

默认情况下,在 .NET Core 3.0 中,你配置了一个 web api,services.AddControllers()然后你配置了 swagger with swashbuckle with services.AddSwaggerGen()+app.UseSwagger()

这工作正常,但是 swagger.json 包含每个操作的多种响应内容类型(text/plain + application/json + text/json)

我知道我可以通过添加[Produces][Consumes]到我的操作来限制这些响应内容类型,但我想为每个操作避免这种情况(即我想在全局范围内这样做)

请注意,我最好使用 System.Text.Json,但如果您有一个仅适用于 Newtonsoft.JSON 的解决方案,那么它总比没有好;)

sjo*_*ten 7

Swashbuckle.AspNetCore.SwaggerGen 5.0使用OpenApiOperation来描述 API 操作。

using System.Collections.Generic;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

public class AssignContentTypeFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.Responses.ContainsKey("200"))
        {
            operation.Responses.Clear();
        }

        var data = new OpenApiResponse
        {
            Description = "Ok",
            Content = new Dictionary<string, OpenApiMediaType>
            {
                ["application/json"] = new OpenApiMediaType(),
                ["application/xml"] = new OpenApiMediaType(),
            }
        };

        operation.Responses.Add("200", data);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Startup.cs 中

        services.AddSwaggerGen(q =>
        {
            q.SwaggerDoc("v1", new OpenApiInfo
            {
                Title = "mytitle",
                Version = "v1",
            });
            q.OperationFilter<AssignContentTypeFilter>();  
        });
Run Code Online (Sandbox Code Playgroud)


Rom*_*syk 5

您可以为 swagger创建自定义过滤器

internal class AssignContentTypeFilter : IOperationFilter
{

    public void Apply(Operation operation, OperationFilterContext context)
    {
        operation.Consumes.Clear();
        operation.Consumes.Add("application/json");

        operation.Produces.Clear();
        operation.Produces.Add("application/json");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后

services.AddSwaggerGen(cfg => cfg.OperationFilter<AssignContentTypeFilter>());
Run Code Online (Sandbox Code Playgroud)

  • 这个想法可行,但对于新的 5.0.0-rc4,您需要使用 opera.RequestBody.Content 和 opera.Responses[].Content (7认同)