2013-03-04 13 views
7

Mam problem z kodem błędu HTTP 404.0 - nie znaleziono. W pliku Web.Config włączyłem Ale problem nadal istnieje. Próbowałem również z tego rozwiązania (Ale to nigdy nie osiągnie metoda):Błąd catch 404 w MVC4

protected void Application_Error() 
    { 
     var exception = Server.GetLastError(); 
     var httpException = exception as HttpException; 
     Response.Clear(); 
     Server.ClearError(); 
     var routeData = new RouteData(); 
     routeData.Values["controller"] = "Errors"; 
     routeData.Values["action"] = "General"; 
     routeData.Values["exception"] = exception; 
     Response.StatusCode = 500; 
     if (httpException != null) 
     { 
     Response.StatusCode = httpException.GetHttpCode(); 
     switch (Response.StatusCode) 
     { 
      case 403: 
      routeData.Values["action"] = "HttpError404"; 
      break; 
      case 404: 
      routeData.Values["action"] = "HttpError404"; 
      break; 
     } 
     } 

     IController errorsController = new ErrorController(); 
     var rc = new RequestContext(new HttpContextWrapper(Context), routeData); 
     errorsController.Execute(rc); 
    } 

dostarczone przez @Darin Dimitrov

Jest to kontroler:

public class ErrorController : Controller 
    { 

    public ActionResult HttpError404(string error) 
    { 
     ViewData["Title"] = "Sorry, an error occurred while processing your request. (404)"; 
     ViewData["Description"] = error; 
     return View("Index"); 
    } 

    public ActionResult HttpError500(string error) 
    { 
     ViewData["Title"] = "Sorry, an error occurred while processing your request. (500)"; 
     ViewData["Description"] = error; 
     return View("Index"); 
    } 


    public ActionResult General(string error) 
    { 
     ViewData["Title"] = "Sorry, an error occurred while processing your request."; 
     ViewData["Description"] = error; 
     return this.View(); 

    } 

Odpowiedz

11

Okej znalazłem rozwiązanie dzięki @ alistair-findlay i this website. ten sposób web.config wygląda teraz:

<system.web> 
    <customErrors mode="On" defaultRedirect="~/Error/General" redirectMode="ResponseRewrite"> 
     </customErrors> 
</system.web> 
    <system.webServer> 
<httpErrors errorMode="Detailed" defaultResponseMode="Redirect"> 
     <clear/> 
     <error statusCode="404" path="/Error/HttpError404"/> 
    </httpErrors> 

    </system.webServer 

i to jest Global.asax.cs:

protected void Application_Error() 
    { 

     if (Context.IsCustomErrorEnabled) 
     ShowCustomErrorPage(Server.GetLastError()); 

    } 
    private void ShowCustomErrorPage(Exception exception) 
    { 
     var httpException = exception as HttpException ?? new HttpException(500, "Internal Server Error", exception); 

     Response.Clear(); 
     var routeData = new RouteData(); 
     routeData.Values.Add("controller", "Error"); 
     routeData.Values.Add("fromAppErrorEvent", true); 

     switch (httpException.GetHttpCode()) 
     { 
     case 403: 
      routeData.Values.Add("action", "HttpError403"); 
      break; 

     case 404: 
      routeData.Values.Add("action", "HttpError404"); 
      break; 

     case 500: 
      routeData.Values.Add("action", "HttpError500"); 
      break; 

     default: 
      routeData.Values.Add("action", "GeneralError"); 
      routeData.Values.Add("httpStatusCode", httpException.GetHttpCode()); 
      break; 
     } 

     Server.ClearError(); 

     IController controller = new ErrorController(); 
     controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
    } 

I wreszcie:

public class ErrorController : Controller 
    { 

    public ActionResult HttpError403(string error) 
    { 
     ViewBag.Description = error; 
     return this.View(); 
    } 
+0

Ten artykuł jest również pomocny do rozmieszczenia na różnych hostach: http://stackoverflow.com/q/1706934/964043 – dmarietta

1

Czy wdrożył ErrorController który obsługuje przekierowania w swoich atrybutach customErrors? W twoim przypadku, to będzie wyglądać mniej więcej tak:

public class ErrorController : Controller 
{ 
    public ActionResult General() 
    { 
     return View(); 
    } 

    public ActionResult HttpError404() 
    { 
     return View(); 
    } 

    public ActionResult HttpError500() 
    { 
     return View(); 
    } 
} 

będzie też trzeba wdrożyć widoki dla każdego z ActionResults w folderze Widoki.

chodzi o zalogowaniu się błąd, trzeba by było zaimplementować to w przewodnika Application_Error zdarzeń następująco:

protected void Application_Error() 
{ 
    var exception = Server.GetLastError(); 
    var httpException = exception as HttpException; 
    // Do logging here 
} 

To jest „haczyk” błąd przed 302 przekierowanie do stron błędów określonych w powyższy kod: ErrorController.

+0

Tak mam wdrożyła ErrorController() (dodałem to do mojego pytania). – mortenstarck

+0

Po przejściu do nieistniejącej strony, co widzisz? "Żółty ekran śmierci" lub strona HttpError404? –

+0

Dodałem ujęcie sceniczne strony, którą otrzymuję. : D – mortenstarck