2014-12-16 10 views
6

w moim web.config cios można zobaczyć redirectMode = "ResponseRewrite". Czytam, że to jest to, czego potrzebuję, aby zachować kod statusu. Niestety, gdy tylko go otrzymam, otrzymuję:Jak korzystać z błędów niestandardowych i zachować kod odpowiedzi?

"Wystąpił wyjątek podczas przetwarzania Twojego żądania. Dodatkowo wystąpił inny wyjątek podczas wykonywania niestandardowej strony błędu dla pierwszego wyjątku." Żądanie zostało zakończone. "

Pominięcie tej zmiennej pomyślnie przekierowuje mnie do ~/Error/Index.cshtml, ale ma odpowiedź 200. doh. Każdy kierunek byłby bardzo doceniany, dzięki.

<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> 

W moich filterconfig.cs:

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

Odpowiedz

1

nie pamiętam gdzie widziałem tego kodu, czy to, co zmienić, ale to działa dobrze w mojej aplikacji sieci web MVC

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

Następnie w folderze udostępnionym strony błędu dodać

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

Powyższe zwraca status 404 dla strony nie znalezionej i 500 dla błędu, mam nadzieję, że pomaga

+0

Dobre rozwiązanie, ale wadą tego jest to, że nie będziesz w stanie uzyskać szczegółowych komunikatów o błędach podczas programowania. –

Powiązane problemy