У меня есть немного кода, который выполняет обработку ошибок для отображения отдельных видов в зависимости от полученной ошибки.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>
И не повезло
Вы знаете, что можете просто сделать это [в web.config] (http://benfoster.io/blog/aspnet-mvc-custom-error-pages)? – Smudge202
Вы используете IIS7 +? Если да, попробуйте работать только с httpErrors. – Chris
Я пробовал их отдельно. Я считаю, что я должен использовать более раннюю версию iis – DaRoGa