2016-02-21 4 views
4

У меня есть несколько пользовательских исключений на моем бизнес-уровне, которые приходят в мои методы API в моем приложении ASP.NET.Пользовательские исключения для кодов состояния Http в API ASP.NET

В настоящее время все они переходят на статус Http 500. Как сопоставить эти пользовательские исключения, чтобы я мог возвращать разные коды статуса Http?

ответ

7

Это возможно, используя Response.StatusCode сеттер и геттер.

Локальная обработка исключений: Для обработки исключений для локальных действий поместите код внутри вызывающего кода.

var responseCode = Response.StatusCode; 
try 
{ 
    // Exception was called 
} 
catch (BusinessLayerException1) 
{ 
    responseCode = 201 
} 
catch (BusinessLayerException2) 
{ 
    responseCode = 202 
} 
Response.StatusCode = responseCode; 

Для поперечного поведения контроллера: Вы должны следовать приведенным ниже инструкциям.

  1. Создать абстрактный BaseController
  2. Сделать текущие контроллеры наследуют от BaseController.
  3. Добавьте следующую логику в BaseController.

BaseController.cs

public abstract class BaseController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 
     var responseCode = Response.StatusCode; 
     var exception = filterContext.Exception; 
     switch (exception.GetType().ToString()) 
     { 
      case "ArgumentNullException": 
       responseCode = 601; 
       break; 

      case "InvalidCastException": 
       responseCode = 602; 
       break; 
     } 
     Response.StatusCode = responseCode; 
     base.OnException(filterContext); 
    } 
} 

Примечание:
Вы также можете добавить исключение как обработанное и перенаправлять его в какой-либо другой Controller/Action

filterContext.ExceptionHandled = true; 
filterContext.Result = this.RedirectToAction("Index", "Error"); 

Дополнительная информация относительно ASP.NET MVC Обработка ошибок можно найти HERE

+0

Спасибо. Это имеет смысл. Один следующий вопрос: где я могу это поставить, чтобы не повторять эту логику в каждом методе API? – Sam

+0

@Sam, Отредактированный мой код, В следующий раз, пожалуйста, укажите этот запрос в начале сообщения. –

+0

Хороший ответ, вы заслуживаете большего количества очков, чем это. –