2012-04-20 7 views
5

Io sono l'attuazione errori personalizzati nel mio MVC3 app, la sua accesa nel web.config:Gli errori personalizzati funzionano con HttpCode 403 ma non con 500?

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

mio controller è molto semplice, con corrispondenti viste con nome in modo corretto:

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

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

per testare, sto gettando le eccezioni in un altro controllore:

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

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

Le 403 opere - vengo reindirizzato alla mia abitudine "/ errori/Http403".

Il 500 non funziona - Io invece viene reindirizzato alla pagina di errore predefinita nella cartella condivisa.

Qualche idea?

risposta

4

c'ho 500 errori e funzionanti utilizzando i httpErrors oltre al customErros standard di configurazione:

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

e rimozione questa linea fro m global.asax

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

la sua non perfetta tuttavia come sto cercando di recuperare l'ultimo errore che è sempre nullo.

Server.GetLastError() 

Vedere https://stackoverflow.com/a/7499406/1048369 per il pezzo più completo sugli errori personalizzate in MVC3 ho trovato che era di grande aiuto.

+1

Vorrei aggiungere: Server.GetLastError sembra essere irrecuperabile :( –

0

Ho lo stesso problema, ho intercettare l'eccezione direttamente in Global.asax in quel caso:

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

     } 

che reindirizza al mio errore personalizzato 500:?/Errore/Indice codice = 500

+0

Non posso ancora accettarlo come risposta, poiché ho funzionato senza utilizzare il metodo Application_Error e utilizzando invece la sezione di configurazione httpErrors. Darei la tua risposta un +1 ma non ho ancora abbastanza rep! Grazie! – Nick

+0

Ovviamente non c'è alcun motivo per cui gli httpErrors non funzionino (configurati bene), la soluzione che utilizzo mi dà più controllo sulle eccezioni non acquisite – fmgp

+0

È logico non valido dichiarare che se httpException è nullo, si deve supporre che si tratti di un errore 500. Un errore 500 deve essere confermato dai dati passati dall'eccezione. –

Problemi correlati