使用多个SwaggerRespons的优雅方式

时间:2018-12-07 13:20:13

标签: c# .net asp.net-mvc asp.net-web-api swagger

我将在控制器上使用以下属性:

    [SwaggerResponse((int)HttpStatusCode.OK, typeof(GetAutotopupConfigurationResponse))]
    [SwaggerResponse((int)HttpStatusCode.BadRequest, typeof(ErrorResponse), BadRequestMessage)]
    [SwaggerResponse((int)HttpStatusCode.Unauthorized, typeof(ErrorResponse), InvalidCredentiasMessage)]
    [SwaggerResponse((int)HttpStatusCode.Forbidden, typeof(ErrorResponse), UserNoRightsMessage)]
    [SwaggerResponse((int)HttpStatusCode.NotFound, typeof(ErrorResponse), AutopopupNotFoundMessage)]
    [SwaggerResponse((int)HttpStatusCode.InternalServerError, typeof(ErrorResponse), InternalServerErrorMessage)]

如何简化逻辑并减少代码量或以某种方式使其更灵活?

1 个答案:

答案 0 :(得分:0)

编辑:该答案适用于Asp.Net-Core,但对于该问题也可能有用。

如果您使用的是Swashbuckle,则可以使用IOperationFilter和Reflection来定位特定的端点并以编程方式应用响应。

可以使用IOperationFilter将InternalServerError应用于服务中的所有端点。下面是一个示例:

public class ServerErrorResponseOperationFilter : IOperationFilter
    {            
        // Applies the specified operation. Adds 500 ServerError to Swagger documentation for all endpoints            
        public void Apply(Operation operation, OperationFilterContext context)
        {
            // ensure we are filtering on controllers
            if (context.MethodInfo.DeclaringType.BaseType.BaseType == typeof(ControllerBase)
                || context.MethodInfo.ReflectedType.BaseType == typeof(Controller))
            {
                operation.Responses.Add("500", new Response { Description = "Server Error" });
            }                        
        }
    }

您需要设置Swagger才能使用这些过滤器。您可以通过添加设置来做到这一点:

services.AddSwaggerGen(swag =>
            {
                swag.SwaggerDoc("v1", new Info { Title = "Docs", Version = "v1" });

                // add swagger filters to document default responses
                swag.OperationFilter<ServerErrorResponseOperationFilter>();
            });

您可以使用其他过滤器来应用“ 401未经授权”,“ 403禁止”等。甚至可以使用“反射”添加201为使用[HttpPost]装饰的动作创建的内容,并且可以对其他Http属性执行类似的操作。

如果您具有用于401、403和500的过滤器,则可以稍微整理一下控制器。您仍将需要为反射无法处理的某些方法添加属性。通过这种方法,我发现只需要添加一个或2个属性,通常是[ProcudesResponseType((int)HttpStatusCode.BadRequest)][ProcudesResponseType((int)HttpStatusCode.NotFound)]