2012-10-31 23 views
5

la mia domanda riguarda la risposta di Pure.Kromes a this post. Ho provato a implementare i messaggi di errore personalizzati delle mie pagine usando il suo metodo, ma ci sono alcuni problemi che non riesco a spiegare.ASP.NET MVC Pagine di errore personalizzate con Unicorno magico

a) Quando si genera un errore 404 immettendo un URL non valido come localhost: 3001/NonexistantPage, per impostazione predefinita viene eseguita l'azione ServerError() del mio controller errori anche se deve passare a NotFound(). Ecco la mia ErrorController:

 
    public class ErrorController : Controller 
    { 
     public ActionResult NotFound() 
     { 
      Response.TrySkipIisCustomErrors = true; 
      Response.StatusCode = (int)HttpStatusCode.NotFound; 
      var viewModel = new ErrorViewModel() 
      { 
       ServerException = Server.GetLastError(), 
       HTTPStatusCode = Response.StatusCode 
      }; 
      return View(viewModel); 
     } 

     public ActionResult ServerError() 
     { 
      Response.TrySkipIisCustomErrors = true; 
      Response.StatusCode = (int)HttpStatusCode.InternalServerError; 

      var viewModel = new ErrorViewModel() 
      { 
       ServerException = Server.GetLastError(), 
       HTTPStatusCode = Response.StatusCode 
      }; 
      return View(viewModel); 
     } 
    } 

miei percorsi di errore in Global.asax.cs:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" }); 

     routes.MapRoute(
      name: "Error - 404", 
      url: "NotFound", 
      defaults: new { controller = "Error", action = "NotFound" } 
      ); 

     routes.MapRoute(
      name: "Error - 500", 
      url: "ServerError", 
      defaults: new { controller = "Error", action = "ServerError" } 
      ); 


E il mio web.config impostazioni:

<system.web> 
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="/ServerError"> 
    <error statusCode="404" redirect="/NotFound" /> 
</customErrors> 
... 
</system.web> 

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" /> 
</httpErrors> 
... 

Le visualizzazioni di errore si trovano in/Views/Error/come NotFound.cshtml e ServerError.cshtml.

b) Una cosa divertente è, quando si verifica un errore del server, lo fa infatti visualizzare la vista Server Error ho definito, ma emette anche un messaggio di errore predefinito pure dire che la pagina di errore non è stata trovata.

Here's how it looks like:


Hai qualche consiglio come potrei risolvere questi due problemi? Mi piace molto l'approccio di Pure.Kromes all'implementazione di questi messaggi di errore, ma se ci sono modi migliori per raggiungere questo obiettivo non esitare a dirmelo.

Grazie!

** MODIFICA: ** Posso accedere direttamente alle mie visualizzazioni tramite ErrorController accedendo a/Error/NotFound o Error/ServerError.

Le viste stesse contengono solo del testo, nessun markup o altro.

Come ho già detto, in realtà funziona in qualche modo, ma non nel modo in cui intendevo che funzionasse. Sembra che ci sia un problema con il reindirizzamento in web.config, ma non sono stato in grado di capirlo.

+1

Puoi pubblicare anche le tue opinioni? Inoltre, non dimenticare di rimuovere questo 'GlobalFilters.Filters.Add (new HandleErrorAttribute());' –

+1

Puoi navigare direttamente alla pagina 404? –

+0

Sì, posso. Il problema qui sembra provenire dalle impostazioni di web.config, anche se non riesco a trovare l'errore lì. – FLClover

risposta

0

L'ho fatto funzionare. Sembra che la mia comprensione del problema sia stata in qualche modo sbagliata all'inizio.

nel web.config, ho cambiato il seguente:

<customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Views/Error/ServerError.cshtml"> 
    <error statusCode="404" redirect="~/Views/Error/NotFound.cshtml" /> 
</customErrors> 

... e ...

<httpErrors errorMode="Custom" existingResponse="Replace"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" path="/NotFound" responseMode="ExecuteURL" /> 
     <remove statusCode="500" subStatusCode="-1" /> 
     <error statusCode="500" path="/ServerError" responseMode="ExecuteURL" /> 
    </httpErrors> 

Questo reindirizza direttamente alle viste. La mia comprensione era che dovevo reindirizzare al controllore degli errori che a sua volta avrebbe reindirizzato alle viste, ma a quanto pare non era così. Vorrei ringraziarvi per i vostri commenti, poiché mi hanno fatto analizzare il problema ancora una volta quando stavo già per abbandonare l'errore personalizzato e semplicemente essere pigro e visualizzare YSOD. :)

2

c'è un altro problema con questa configurazione, quando si hanno percorsi più complessi e si hanno diversi segmenti ex.

http://localhost:2902/dsad/dadasdmasda/ddadad/dadads/ddadad/dadadadad/ 

ho avuto errore del server ->

Sorry, an error occurred while processing your request. 


Exception: An error occured while trying to Render the custom error view which you provided, for this HttpStatusCode. ViewPath: ~/Views/Error/NotFound.cshtml; Message: The RouteData must contain an item named 'controller' with a non-empty string value. 
Source: 

mia soluzione per questo è stato quello di aggiungere ulteriore percorso alla fine dopo percorso di default

 routes.MapRoute(
      "Default Catch all 404", 
      "{controller}/{action}/{*catchall}", 
      new { controller = "Error", action = "NotFound" } 
     ); 

speranza che potrebbe aiutare qualcuno :-)

+0

Sei corretto. Lo incorporerò anche nei miei percorsi. Grazie! – FLClover

Problemi correlati