2016-03-23 5 views
1

У меня есть немного кода, который выполняет обработку ошибок для отображения отдельных видов в зависимости от полученной ошибки.C# MVC Определение успешного кода состояния Http

Мой код выглядит следующим образом:

protected void Application_EndRequest() 
    { 
     var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode); 
     if (!response.IsSuccessStatusCode) 
     { 
      var rd = new RouteData(); 
      IController c = new ErrorController(); 
      switch (response.StatusCode) 
      { 
       case HttpStatusCode.BadRequest: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "BadRequest"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.NotFound: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "NotFound"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.InternalServerError: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "InternalServerError"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.Forbidden: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "Forbidden"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       default: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "GenericError"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
      } 
     } 

Это работает для стандартных кодов состояния HTTP и, как это определено в документации, и ответ код 200-299 не получает обрабатываются и проходит.

Однако, мой вопрос заключается в том, что это лучший способ сделать это?

Это связано с одним из моих запросов, возвращающим код состояния 302 - Найдено. Теперь, согласно документации, это не будет классифицироваться как успешный код, однако я не вижу, как его нельзя назвать успешным.

Поэтому есть ли лучший способ сделать это, чтобы учесть все успешные коды, а не только 200-299?

Большое спасибо за любой вклад и мнения. Я понимаю, что не может быть абсолютного ответа на этот вопрос.

Ввод 1 предложение там было бы изменить, если заявление:

if(!(statuscode >= 400 && statuscode <= 599) 

Это потому, что 4xx коды определяются как ошибки клиента и 5xx коды определяются как ошибки сервера. Поэтому он должен их поймать?

Но что делать с ужасным 418? :)

EDIT

Я попытался с помощью httpErrors:

<httpErrors errorMode="Custom" existingResponse="Replace"> 
    <clear/> 
    <error path="/Error/NotFound" responseMode="ExecuteURL" statusCode="400"/> 
</httpErrors> 

Как также CustomErrors в web.config:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
    <error statusCode="403" redirect="~/Error/Forbidden" /> 
    <error statusCode="500" redirect="~/Error/InternalServerError" />   
</customErrors> 

И не повезло

+0

Вы знаете, что можете просто сделать это [в web.config] (http://benfoster.io/blog/aspnet-mvc-custom-error-pages)? – Smudge202

+0

Вы используете IIS7 +? Если да, попробуйте работать только с httpErrors. – Chris

+0

Я пробовал их отдельно. Я считаю, что я должен использовать более раннюю версию iis – DaRoGa

ответ

1

Вы не обязательно должны покрывать все erro r (от 400 до 500).

Посмотрите: Which HTTP Status Codes to cover for MVC error handling

И лучше использовать обработчики уже в трубопроводе вместо того, что вы делаете в Application_EndRequest(). Я имею в виду, что вы должны использовать <httpErrors ... и/или <customErrors в web.config.

<httpErrors> конфигурирует IIS, а <customErrors> конфигурирует ASP.NET Источник: How to add a default error page using httpErrors

Пример: How can I properly handle 404 in ASP.NET MVC?

Еще одна интересная статья: Demystifying ASP.NET MVC 5 Error Pages and Error Logging

Эта статья объясняет подробно, как правильно настроить 404 и 500: Custom error pages in ASP.NET MVC. Easy, right?

+0

Не могли бы вы объяснить далее. Я попытался использовать CustomErrors ранее и не мог заставить его работать, поэтому я пошел с этим подходом – DaRoGa

+0

Я отредактировал свой ответ, возможно, вы захотите немного поработать с Google, это общий вопрос. – Chris

+0

см. Мое редактирование – DaRoGa

1

Ну, я не уверен, коды ошибок, но вы не должны копировать и вставлять такой код.

Выполните функцию вместо этого.

protected void Application_EndRequest() 
{ 
    var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode); 

    if (!response.IsSuccessStatusCode) 
    { 
     switch (response.StatusCode) 
     { 
      case HttpStatusCode.BadRequest: 
       ErrorAction("BadRequest"); 
       break; 
      case HttpStatusCode.NotFound: 
       ErrorAction("NotFound"); 
       break; 
      case HttpStatusCode.InternalServerError: 
       ErrorAction("InternalServerError"); 
       break; 
      case HttpStatusCode.Forbidden: 
       ErrorAction("Forbidden"); 
       break; 
      default: 
       ErrorAction("GenericError"); 
       break; 
     } 
    } 
} 

// Sends a request to the ErrorController 
private void ErrorAction(string action) 
{ 
    var rd = new RouteData(); 
    IController c = new ErrorController(); 

    Response.Clear(); 

    rd.Values["controller"] = "Error"; 
    rd.Values["action"] = action; 

    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
} 

Этот код предполагает, что вы могли бы устранить различные действия ErrorController вообще, а просто передать StatusCode в строки запроса к методу одного действия.

+0

Я согласен, что код не уточняется и нуждается в очистке, чтобы избежать дублирования кода, это было чисто, так как у меня не было возможности сделать это пока, и мне хотелось получить мысли. Я буду реорганизовывать, как вы предлагали, как мне нравится этот подход. Однако вы считаете, что это будет подходящее решение для выполнения этой работы или есть лучший/более совершенный метод? – DaRoGa

+0

Как @Chris говорит в другом ответе, вам не нужно писать этот код. MVC обрабатывает ошибки в файле web.config. См. Http://stackoverflow.com/questions/717628/asp-net-mvc-404-error-handling – buffjape

+0

PS. Старайтесь избегать написания кода, который нуждается в очистке. :-) – buffjape