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.
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.
Puoi pubblicare anche le tue opinioni? Inoltre, non dimenticare di rimuovere questo 'GlobalFilters.Filters.Add (new HandleErrorAttribute());' –
Puoi navigare direttamente alla pagina 404? –
Sì, posso. Il problema qui sembra provenire dalle impostazioni di web.config, anche se non riesco a trovare l'errore lì. – FLClover