ASP.NET MVC 3上的自定义错误页

ASP.NET MVC 3上的自定义错误页

我正在开发一个MVC 3基础网站,我正在寻找一个处理错误的解决方案,并为每种错误呈现自定义视图。因此,假设我有一个“Error”Controller,其中他的主要操作是“Index”(泛型错误页),并且对于用户可能出现的错误,这个控制器还会有几个操作,比如“Handle 500”或“HandleActionNotFound”。

因此,网站上可能发生的每一个错误都可能由这个“Error”Controller(例如:“Controller”或“Action”未找到、500、404、dbException等)处理。

我使用站点地图文件来定义网站路径(而不是路由)。

这个问题已经回答了,这是对Gweebz的答复。

我的最后一个应用程序错误方法如下:

protected void Application_Error() {
//while my project is running in debug mode
if (HttpContext.Current.IsDebuggingEnabled && WebConfigurationManager.AppSettings["EnableCustomErrorPage"].Equals("false")){
    Log.Logger.Error("unhandled exception: ", Server.GetLastError());}else{
    try
    {
        var exception = Server.GetLastError();

        Log.Logger.Error("unhandled exception: ", exception);

        Response.Clear();
        Server.ClearError();
        var routeData = new RouteData();
        routeData.Values["controller"] = "Errors";
        routeData.Values["action"] = "General";
        routeData.Values["exception"] = exception;

        IController errorsController = new ErrorsController();
        var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
        errorsController.Execute(rc);
    }
    catch (Exception e)
    {
        //if Error controller failed for same reason, we will display static HTML error page
        Log.Logger.Fatal("failed to display error page, fallback to HTML error: ", e);
        Response.TransmitFile("~/error.html");
    }}}


胡说叔叔
浏览 617回答 3
3回答

慕莱坞森

下面是我如何处理自定义错误的一个例子。我定义ErrorsController对于处理不同HTTP错误的操作:public class ErrorsController : Controller{     public ActionResult General(Exception exception)     {         return Content("General failure", "text/plain");     }     public ActionResult Http404()     {         return Content("Not found", "text/plain");     }     public ActionResult Http403()     {         return Content("Forbidden", "text/plain");     }}然后我订阅了Application_Error在……里面Global.asax并调用此控制器:protected void Application_Error(){     var exception = Server.GetLastError();     var httpException = exception as HttpException;     Response.Clear();     Server.ClearError();     var routeData = new RouteData();     routeData.Values["controller"] = "Errors";     routeData.Values["action"] = "General";     routeData.Values["exception"] = exception;     Response.StatusCode = 500;     if (httpException != null)     {         Response.StatusCode = httpException.GetHttpCode();         switch (Response.StatusCode)         {             case 403:                 routeData.Values["action"] = "Http403";                 break;             case 404:                 routeData.Values["action"] = "Http404";                 break;         }     }     IController errorsController = new ErrorsController();     var rc = new RequestContext(new HttpContextWrapper(Context), routeData);     errorsController.Execute(rc);}

慕田峪9158850

您也可以在Web.Config文件中这样做。下面是一个在IIS 7.5中工作的示例。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<system.webServer> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<httpErrors&nbsp;errorMode="DetailedLocalOnly"&nbsp;defaultResponseMode="File"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="502"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="501"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="412"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="406"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="405"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="404"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="403"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="401"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<remove&nbsp;statusCode="500"&nbsp;subStatusCode="-1"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="500"&nbsp;path="/notfound.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="401"&nbsp;prefixLanguageFilePath=""&nbsp;path="/500.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="403"&nbsp;prefixLanguageFilePath=""&nbsp;path="/403.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="404"&nbsp;prefixLanguageFilePath=""&nbsp;path="/404.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="405"&nbsp;prefixLanguageFilePath=""&nbsp;path="/405.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="406"&nbsp;prefixLanguageFilePath=""&nbsp;path="/406.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="412"&nbsp;prefixLanguageFilePath=""&nbsp;path="/412.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="501"&nbsp;prefixLanguageFilePath=""&nbsp;path="/501.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<error&nbsp;statusCode="502"&nbsp;prefixLanguageFilePath=""&nbsp;path="/genericerror.html"&nbsp;responseMode="ExecuteURL"&nbsp;/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</httpErrors></system.webServer>
打开App,查看更多内容
随时随地看视频慕课网APP