che ho fatto alcune modifiche per Global.asax in modo che io possa mostrare pagine di errore personalizzate (403, 404, e 500) Ecco il codice:pagine di errore non trovato, gettando errore ELMAH con Pagine di errore
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
//FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
protected void Application_Error(object sender, EventArgs e)
{
if (Context.IsCustomErrorEnabled)
{
ShowCustomErrorPage(Server.GetLastError());
}
}
private void ShowCustomErrorPage(Exception exception)
{
HttpException httpException = exception as HttpException;
if (httpException == null)
{
httpException = new HttpException(500, "Internal Server Error", exception);
}
Response.Clear();
RouteData routeData = new RouteData();
routeData.Values.Add("controller", "Error");
routeData.Values.Add("fromAppErrorEvent", true);
switch (httpException.GetHttpCode())
{
case 403:
routeData.Values.Add("action", "AccessDenied");
break;
case 404:
routeData.Values.Add("action", "NotFound");
break;
case 500:
routeData.Values.Add("action", "ServerError");
break;
default:
routeData.Values.Add("action", "DefaultError");
routeData.Values.Add("httpStatusCode", httpException.GetHttpCode());
break;
}
Server.ClearError();
IController controller = new ErrorController();
controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
}
}
ho anche aggiunto il seguente al mio web.config:
pagine di errore<customErrors mode="On">
<!-- There is custom handling of errors in Global.asax -->
</customErrors>
la personalizzati visualizzati correttamente, e ELMAH registrerà correttamente l'errore che è stato (volutamente) gettato. Ma anche ELMAH cattura e registra un errore aggiuntivo:
System.InvalidOperationException: The view 'Error' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/account/Error.aspx ~/Views/account/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/account/Error.cshtml ~/Views/account/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml
miei primi istinto mi ha portato alla disattivazione globale HandleErrorAttribute
nella configurazione del filtro. E domande simili come: MVC problem with custom error pages mi hanno indotto a credere che i miei sospetti fossero corretti. Ma anche dopo aver disabilitato il globale HandleErrorAttribute
, sto ancora ricevendo l'errore che la vista Errori non è stata trovata! Cosa dà? La mia unica altra impressione è che il mio controller di base deriva dal System.Web.Mvc.Controller
ho cercato di esaminare la fonte per vedere se il HandleErrorAttribute
viene applicato al System.Web.Mvc.Controller
ma non poteva ricavare nulla ...
UPDATE: ho provato sovrascrivendo il mio controller di base per contrassegnare le eccezioni come gestite in questo modo:
protected override void OnException(ExceptionContext filterContext)
{
filterContext.ExceptionHandled = true;
base.OnException(filterContext);
}
ma che non ha risolto il problema.
UPDATE2: Ho inserito un file Error.aspx nelle viste condivise, solo per vedere cosa sarebbe successo. Quando è lì, ELMAH registra l'eccezione forzata, e quindi la vista condivisa viene pubblicata - non raggiunge mai lo Application_Error()
.... non sono sicuro di cosa farne.
Inoltre, assicurati che l'MVC predefinito error handler è stato rimosso da FilterConfig – solidau
Questo è stato davvero difficile da trovare ... grazie –
http: // beletsky.net/2012/11/elmahmvc-202-is-out.html "È elmah.mvc.disableHandleErrorFilter. Di default è' false', che significa 'HandleErrorAttribute()' di ELMAH.MVC. Per disabilitarlo, basta impostare fedele a questa impostazione. " – PussInBoots