2014-12-16 2 views
6

in meinem web.config blasen können Sie redirectMode = "ResponseRewrite" sehen. Ich lese das ist, was ich brauche, um den Statuscode zu erhalten. Leider sobald ich es habe, bekomme ich:Wie verwenden Sie benutzerdefinierte Fehler und behalten Sie den Antwortcode bei?

"Eine Ausnahme ist bei der Verarbeitung Ihrer Anfrage aufgetreten. Darüber hinaus trat eine weitere Ausnahme beim Ausführen der benutzerdefinierten Fehlerseite für die erste Ausnahme. Die Anfrage wurde beendet."

Das Auslassen dieser Variablen leitet mich erfolgreich zu ~/Error/Index.cshtml um, hat aber eine Antwort von 200. doh. Jede Richtung würde sehr geschätzt werden, danke.

<system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Index"> 
     <error statusCode="404" redirect="~/Error/Index"/> 
     <error statusCode="500" redirect="~/Error/Index"/> 
    </customErrors> 
    <httpRuntime targetFramework="4.5" /> 
    </system.web> 
    <system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL"> 
     <remove statusCode="403"/> 
     <remove statusCode="404"/> 
     <remove statusCode="500"/> 
     <error statusCode="403" path="~/Error/Index" responseMode="File"/> 
     <error statusCode="404" path="~/Error/Index" responseMode="File"/> 
     <error statusCode="500" path="~/Error/Index" responseMode="File"/> 
    </httpErrors> 
    </system.webServer> 

In meinem filterconfig.cs:

public class FilterConfig 
    { 
     public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
     { 
      // does this conflict? 
      filters.Add(new HandleErrorAttribute()); 
     } 
    } 

Antwort

1

Kann mich nicht erinnern, wo ich diesen Code sah, oder was ich verändert, aber es funktioniert gut in meinem MVC Web-App

Web.config

<system.web> 
    <compilation debug="true" targetFramework="4.5.1" /> 
    <httpRuntime targetFramework="4.5.1" /> 
    <customErrors mode="Off" /> 
    </system.web> 

Global.aspx

protected void Application_EndRequest(Object sender, EventArgs e) 
     { 
      ErrorConfig.Handle(Context); 
     } 

ErrorConfig.cs

namespace Web.UI.Models.Errors 
{ 
    public static class ErrorConfig 
    { 
     public static void Handle(HttpContext context) 
     { 
      switch (context.Response.StatusCode) 
      { 
       case 401: 
        Show(context, 401); 
        break; 
       case 404: 
        Show(context, 404); 
        break; 
       case 500: 
        Show(context, 500); 
        break; 
      } 
     } 
     //TODO uncomment 500 error 
     static void Show(HttpContext context, Int32 code) 
     { 
      context.Response.Clear(); 

      var w = new HttpContextWrapper(context); 
      var c = new ErrorController() as IController; 
      var rd = new RouteData(); 

      rd.Values["controller"] = "Error"; 
      rd.Values["action"] = "Index"; 
      rd.Values["id"] = code.ToString(CultureInfo.InvariantCulture); 

      c.Execute(new RequestContext(w, rd)); 
     } 
    } 
} 

Errorcontroller

public class ErrorController : Controller 
    { 
     // GET: Error 
     [HttpGet] 
     public ViewResult Index(Int32? id) 
     { 
      var statusCode = id.HasValue ? id.Value : 500; 
      var error = new HandleErrorInfo(new Exception("An exception with error " + statusCode + " occurred!"), "Error", "Index"); 

      int errorCode = statusCode; 
      ViewBag.error = errorCode; 
      return View("Error"); 
     } 
    } 

ErrorsViewModel

namespace Web.UI.Models.Errors 
{ 
    public class ErrorViewModel 
    { 
     public string DisplayErrorMessage { get; set; } 
     public string DisplayErrorPageTitle { get; set; } 
    } 
} 

Dann Seite im freigegebenen Ordner Fehler hinzufügen

@model Web.UI.Models.Errors.ErrorViewModel 

@{ 
    int errorCode = Convert.ToInt32(@ViewBag.error); 


    switch (errorCode) 
    { 
     case 404: 
      ViewBag.Title = "404 Page Not Found"; 
      Html.RenderPartial("~/Views/Shared/ErrorPages/HttpError404.cshtml"); 
      break; 
     case 500: 
      ViewBag.Title = "Error Occurred"; 
      Html.RenderPartial("~/Views/Shared/_Error.cshtml"); 
      break; 
     default: 
      ViewBag.Title = @Model.DisplayErrorPageTitle; 
      Html.RenderPartial("~/Views/Shared/ErrorPages/HttpNoResultsFound.cshtml"); 
      break; 
    } 
} 

Die oben genannten Erträge 404 Status Seite gefunden und 500 nicht für Fehler, hoffen, dass es

+0

Nizza Lösung hilft, aber der Nachteil ist, dass Sie nicht in der Lage sein werden, detaillierte Fehlermeldungen während der Entwicklung zu erhalten. –

Verwandte Themen