API控制器是否应该尝试捕获所有500个内部服务器错误?

时间:2018-11-14 02:35:58

标签: asp.net-web-api2

很抱歉,如果您之前曾询问过此问题,请链接到我。我很难找到关于在API中捕获所有内部服务器错误(500)是否可以接受的讨论。

我已经看到了一些反对和反对的说法。 我一直听说,如果可能的话,应该发送状态而不是错误。但是,我确实看到500在语义上对失败的请求负责,并让客户知道他们的请求可能没有错。但是状态也可以说明这一点,然后500仅保留给应用程序容器级别的错误,而不是数据库或类库中的错误。

是否存在公认的标准或这是一个意见主题?

例如

public HttpResponseMessage GetUserRoles()
{
    try
    {
        return Request.CreateResponse(HttpStatusCode.OK, AuthorizationService.GetUserRoles());
    } 
    catch (SqlException sqle)
    {
        // log the exception
        return Request.CreateResponse(HttpStatusCode.BadRequest, "A data error occured. Contact IT Support.");
    }
    catch (Exception e)
    {
        // log the exception
        return Request.CreateResponse(HttpStatusCode.BadRequest, "An error occured. Contact IT Support.");
    }
}

1 个答案:

答案 0 :(得分:0)

一个好的做法是始终返回相同的结构

 public interface IResponse<T>
    {
        MsgType MsgType { get; }
        string Msg { get; }
        T Result { get; }
        string Origin { get; }
    }

然后您可以使用这些方法创建 MasterApiController

[NonAction]
public IHttpActionResult ResponseOk<T>(T result)
{
     return Ok<IResponse>(ResponseFactory.Create<T>(result, "", "Negocio"));
}

[NonAction]
public IHttpActionResult ResponseEx(Exception ex, string msg = "Un error ha ocurrido.")
{
     return ResponseMessage(Request.CreateResponse<IResponse>(HttpStatusCode.InternalServerError, ResponseFactory.Create(msg, ex, "Negocio")));
}

在从主控制器继承的控制器中,您称之为

[HttpGet]
[Route("Api/Alumno/Search")]
public dynamic Search(string codigo, string nombre, string estado, int? curso, int? paralelo)
{    
    return ResponseOk<dynamic>(result);
}

对于所有不受控制的异常,您可以使用操作过滤器并进行管理

public class ErrorLoggingFilter : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        //Exception
    }
}