Должен ли контроллер API пытаться перехватить все 500 внутренних ошибок сервера? - PullRequest
0 голосов
/ 14 ноября 2018

Прошу прощения, если об этом уже спрашивали, пожалуйста, свяжите меня с ним.Мне трудно найти обсуждение того, является ли приемлемой практика перехвата всех внутренних ошибок сервера (500) в API.

Я видел некоторые аргументы за это, а некоторые против.Я всегда слышал, что нужно отправлять статус, а не ошибки, когда это возможно.Тем не менее, я вижу, как 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 голосов
/ 15 ноября 2018

Хорошая практика - всегда возвращать одну и ту же структуру

 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
    }
}
...