Перехват исключения из контроллера и отправка в качестве ответа

#api #asp.net-core

Вопрос:

У меня есть приложение WebAPI. Каждый ответ основан на этой модели

 public class CustomHttpResponse
{
     public int status { get; set; }
     public string message { get; set; }
     public object data { get; set; }
}
 

Пример ответа для автоматической настройки, выглядит следующим образом

 {
   "status": 200,
   "message": "Logged succesfull",
   "data":    {
      "firstName": "Test",
      "lastName": "User",
      "username": "test",
      "token": "AUTH_TOKEN"
   }
}
 

Теперь я хочу перехватить каждое исключение, которое было выдано в любом контроллере, и отправить ответ пользователю, например

 {
   "status": 500,
   "message": "Internal Server Error",
   "data":    null
}
 

Я пытался использовать промежуточное программное обеспечение, но Invoke метод возвращает тип Task , и я не знаю, как с этим работать. Другим способом было переопределить OnActionExecuting from Controller , но есть void возвращаемый тип, и я не знаю, что с этим делать.

Комментарии:

1. Вы могли бы определить глобальный класс обработчика исключений, который позволит вам определять пользовательские ответы на основе типа исключения. Возможно, эта ссылка будет вам полезна stackify.com/csharp-catch-all-exceptions

2. Спасибо. Решение с ошибкой, связанной с пользовательским маршрутом в контроллере, является замечательным. Я могу отправить статус 500 при исключении, но при моем собственном типе исключения я могу отправить сообщение об ошибке пользователю. <3

Ответ №1:

Если это для asp.net затем core использует метод configure. Главное здесь — увидеть UseExceptionHandler.

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();                
            }

            app.UseExceptionHandler(configure =>
            {
                configure.Run(async context =>
                {
                    context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
                    await context.Response.WriteAsJsonAsync(new
                    {
                        Message = "Internal Server Error",
                        Data = default(string),
                    });
                });
            });