C# Swashbuckle SwaggerResponseAttribute

本文关键字:SwaggerResponseAttribute Swashbuckle | 更新日期: 2023-09-27 18:12:17

我有一个WebApi项目,我正在尝试实现Swagger。我正在使用Swahbuckle(5.2.1(。在我的实际项目中,我已经有了一个响应属性:

[ResponseForApi(HttpStatusCode.OK)]

我的问题是我正在使用Swashbuckle(5.2.1(,我不想为我的方法添加其他属性。我知道如何在Swagger上放置响应,我可以使用"XML注释"或属性:

[SwaggerResponse(HttpStatusCode.OK)]

我的问题是:有没有一种方法可以通过调用"ResponseForApi"来使用"SwaggerResponse"?

C# Swashbuckle SwaggerResponseAttribute

您可以通过基于ApplySwagerResponseAttributes连接自己的IOperationFilter来实现这一点——这就是扫描[SwaggerResponse]的方法。这是我根据Swashbuckle代码想出的东西https://github.com/domaindrivendev/Swashbuckle/blob/master/Swashbuckle.Core/Swagger/Annotations/ApplySwaggerResponseAttributes.cs

public class ApplyResponseTypeAttributes : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (apiDescription.GetControllerAndActionAttributes<SwaggerResponseRemoveDefaultsAttribute>().Any())
        {
            operation.responses.Clear();
        }
        // SwaggerResponseAttribute trumps ResponseTypeAttribute
        var swaggerAttributes = apiDescription.GetControllerAndActionAttributes<SwaggerResponseAttribute>();
        if (!swaggerAttributes.Any())
        {
            var responseAttributes = apiDescription.GetControllerAndActionAttributes<ResponseTypeAttribute>().OrderBy(attr => attr.ResponseType.Name);
            foreach (var attr in responseAttributes)
            {
                const string StatusCode = "200";
                operation.responses[StatusCode] = new Response
                {
                    description = InferDescriptionFrom(StatusCode),
                    schema = (attr.ResponseType != null) ? schemaRegistry.GetOrRegister(attr.ResponseType) : null
                };
            }
        }
    }
    private string InferDescriptionFrom(string statusCode)
    {
        HttpStatusCode enumValue;
        if (Enum.TryParse(statusCode, true, out enumValue))
        {
            return enumValue.ToString();
        }
        return null;
    }
}

在你招摇过市的配置中/App_Start添加以下内容以注册此筛选器。实际上,在上面设置一个断点非常有趣,这样你就可以看到Swashbuckle是如何工作的,它会迭代你的控制器的所有操作。

c.OperationFilter<ApplyResponseTypeAttributes>();
相关文章:
  • 没有找到相关文章