2012-04-20 12 views
5

Ja realizacji niestandardowych błędów w moim MVC3 aplikacji, jej włączone w pliku web.config:Błędy niestandardowe działa dla HttpCode 403, ale nie 500?

<customErrors mode="On"> 
    <error statusCode="403" redirect="/Errors/Http403" /> 
    <error statusCode="500" redirect="/Errors/Http500" /> 
</customErrors> 

Moje kontroler jest bardzo prosta, z odpowiednimi prawidłowo nazwane widoki:

public class ErrorsController : Controller 
{ 
    public ActionResult Http403() 
    { 
     return View("Http403"); 
    } 

    public ActionResult Http500() 
    { 
     return View("Http500"); 
    } 
} 

przetestować, ja rzucać wyjątków w innym kontrolerze:

public class ThrowingController : Controller 
{ 
    public ActionResult NotAuthorised() 
    { 
     throw new HttpException(403, ""); 
    } 

    public ActionResult ServerError() 
    { 
     throw new HttpException(500, ""); 
    } 
} 

403 prace - ja przekierowany do mojego zwyczaju „/ Błędy/Http403”.

500 nie działa - jestem przekierowywany na domyślną stronę błędu w folderze współdzielonym.

Wszelkie pomysły?

Odpowiedz

4

mam 500 błędów i działa za pomocą httpErrors oprócz standardowego customErros config:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="403" subStatusCode="-1" /> 
     <error statusCode="403" path="/Errors/Http403" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/Errors/Http500" responseMode="ExecuteURL" /> 
    </httpErrors> 
    </system.webServer> 

i usuwania tej linii fro m global.asax

GlobalFilters.Filters.Add(new HandleErrorAttribute()); 

jej nie idealny ale jak próbuję odzyskać ostatni błąd, który zawsze ma wartość null.

Server.GetLastError() 

Zobacz https://stackoverflow.com/a/7499406/1048369 dla najbardziej kompleksowy kawałek na własnych błędach w MVC3 Znalazłem co było bardzo pomocne.

+1

Chciałbym dodać, że: Server.GetLastError wydaje się być nieodwracalne :( –

0

Mam ten sam problem, mam złapać Exception bezpośrednio w Global.asax w tym przypadku:

protected void Application_Error(object sender, EventArgs e) 
     { 
      Exception exception = Server.GetLastError(); 

      Response.Clear(); 



      HttpException httpException = exception as HttpException; 

      var code = httpException == null ? 500 : httpException.GetHttpCode(); 

      // Log the exception. 
      if (code == 500) 
       logError.Error(exception); 

      Server.ClearError(); 

      Context.Items["error"] = code; 

      RouteData routeData = new RouteData(); 
      routeData.Values.Add("controller", "Error"); 
      routeData.Values.Add("action", "Index"); 
      routeData.Values.Add("code", code); 

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

     } 

który przekierowuje do mojego niestandardowego Error 500:/Error/Index code = 500

+0

Nie mogę zaakceptować tego jako odpowiedzi, ponieważ mam ją działającą bez użycia metody Application_Error i używania w tym celu sekcji httpErrors config. Dałbym twoją odpowiedź +1, ale nie mam jeszcze dość rep! Pozdrawiam! – Nick

+0

Oczywiście nie ma powodu, dla którego httpErrors nie działają (dobrze skonfigurowane), rozwiązanie, którego używam, daje mi większą kontrolę nad niezaliczonymi wyjątkami. – fmgp

+0

Nieprawidłową logiką jest stwierdzenie, że jeśli wyjątek httpEe jest zerowy, należy założyć, że jest to błąd 500. Błąd 500 musi zostać potwierdzony przez dane przekazane przez wyjątek. –

Powiązane problemy