2

Я пытался исправить свою ошибку обработки для MVC немного и реализовано решение Марко здесь:
ASP.NET MVC 404 Error Handling404 пузыри ошибок через MVC контроллер ошибок

Это отлично работает на моей рабочей станции Win7. Но по какой-то причине он не работает на сервере. Некоторые ошибки работают нормально, но, например, если я вызываю контроллер и маршрут, которого не существует, я получаю стандартную страницу IIS 404.

Я поместил несколько журналов и вызывается и выполняется Error404Controller, но по какой-то причине обработка не останавливается и после этого загружает страницу ошибки IIS 404.

Это код в моем global.asax

protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 404) 
    { 
     Response.Clear(); 

     var rd = new RouteData(); 
     rd.Values["controller"] = "Error404"; 
     rd.Values["action"] = "Index"; 

     IController c = new SuperMvc.Controllers.Error404Controller(); 
     c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
    } 
} 

И это контроллер:

[AcceptVerbs(HttpVerbs.Get)] 
public virtual ActionResult Index() 
{ 
    log.Error("Error404Controller.Index"); 

    PageError error = new PageError(); 

    error.Url = Request.Url.AbsoluteUri; 
    log.Error("Request.Url=" + error.Url); 

    error.UrlReferrer = Request.UrlReferrer.AbsoluteUri; 
    log.Error("Request.UrlReferrer=" + error.Url); 

    return View(error); 
} 

Любые идеи? Я проверил файлы web.config и не могу найти разницы.

+0

Когда вы пытаетесь контроллер/действие, которое не существует, вы вошли код статуса? Это определенно 404 к тому времени, когда он доберется до этой точки? (Я думаю, что иногда я использовал, чтобы получить бла, не реализует IController - это будет код 500) – Carl

+0

Нет, я получаю код ответа 404 в Application_EndRequest и вызывается Error404Controller, но я все еще получаю IIS 404 вместо моей. – Remy

ответ

2

Если в IIS7 вам необходимо сообщить IIS7, чтобы игнорировать пользовательские страницы ошибок, используя Response.TrySkipIisCustomErrors = true;. Это приведет к отключению пользовательских страниц ошибок IIS для этого ответа в соответствии с the msdn.

Так что ваш Application_EndRequest может выглядеть следующим образом:

protected void Application_EndRequest() 
{ 
    if (Context.Response.StatusCode == 404) 
    { 
     Response.Clear(); 

     var rd = new RouteData(); 
     rd.Values["controller"] = "Error404"; 
     rd.Values["action"] = "Index"; 

     Response.TrySkipIisCustomErrors = true; 
     IController c = new SuperMvc.Controllers.Error404Controller(); 
     c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
    } 
} 
+0

Приветствия! Вы должны добавить в web.config, а затем, похоже, сработает. – Remy

Смежные вопросы