我将在控制器上使用以下属性:
[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)]
如何简化逻辑并减少代码量或以某种方式使其更灵活?
答案 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)]
。