2013-03-04 17 views
7

Ich habe ein Problem mit dem HTTP-Fehler 404.0 - nicht gefunden. Ich habe dieCatch 404 Fehler in MVC4

in der Web.Config eingeschaltet. Aber das Problem existiert immer noch. Ich habe auch versucht, diese Lösung (Aber es nie erreicht die Methode):

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); 
    } 

zur Verfügung gestellt von @Darin Dimitrov

Dies ist der Controller:

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(); 

    } 

Antwort

11

Okay, ich fand eine Lösung dank @ Alistair-Findlay und this website. Dies ist, wie die web.config wie jetzt aussieht:

<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 

Und das ist der 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)); 
    } 

Und schließlich:

public class ErrorController : Controller 
    { 

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

Dieser Artikel ist auch hilfreich für die Bereitstellung auf verschiedenen Hosts: http://stackoverflow.com/q/1706934/964043 – dmarietta

1

Haben Sie einen ErrorController implementiert, die Umleitungen Griffe in deinen customErrors-Attributen? In Ihrem Fall wäre es etwa so aussehen:

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

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

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

Sie müssen auch für jeden des ActionResults in Ihren Ansichten Ordner die Ansichten implementieren.

In Bezug auf die Protokollierung der Fehler, müssten Sie diese in der Application_Error Ereignishandler implementieren, wie folgt:

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

Dies ist der Fehler vor dem 302 auf Ihre Fehlerseiten umleiten definiert zu „fangen“ ist in die ErrorController oben.

+0

Ja i implementiert die ErrorController() (Ich habe es zu meiner Frage hinzugefügt). – mortenstarck

+0

Wenn Sie zu einer nicht vorhandenen Seite navigieren, was sehen Sie? Der "gelbe Bildschirm des Todes" oder die HttpError404 Seite? –

+0

Ich habe eine Szenenaufnahme der Seite hinzugefügt, die ich bekomme. : D – mortenstarck