很抱歉,如果您之前曾询问过此问题,请链接到我。我很难找到关于在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.");
}
}
答案 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
}
}