我想要显示500,404和403的自定义错误页面 . 这是我所做的:
- 在web.config中启用了自定义错误,如下所示:
<customErrors mode="On"
defaultRedirect="~/Views/Shared/Error.cshtml">
<error statusCode="403"
redirect="~/Views/Shared/UnauthorizedAccess.cshtml" />
<error statusCode="404"
redirect="~/Views/Shared/FileNotFound.cshtml" />
</customErrors>
- 注册
HandleErrorAttribute
作为FilterConfig
类中的全局操作过滤器,如下所示:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new CustomHandleErrorAttribute());
filters.Add(new AuthorizeAttribute());
}
-
为上述每条消息创建了自定义错误页面 . 500的默认值已经开箱即用 .
-
在每个自定义错误页面视图中声明该页面的模型是
System.Web.Mvc.HandleErrorInfo
对于500,它显示自定义错误页面 . 对于其他人,它没有 .
有什么我想念的吗?
当我通读 HandleErrorAttribute
类的 OnException
方法中的代码并且它只处理500时,它看起来并不是显示自定义错误的全部内容 .
我该怎么做才能处理其他错误?
11 回答
我已经完成了所有设置,但仍然无法在我们的登台服务器上看到状态代码500的正确错误页面,尽管事实上在本地开发服务器上一切正常 .
我发现Rick Strahl的this blog post给了我很多帮助 .
我需要将
Response.TrySkipIisCustomErrors = true;
添加到我的自定义错误处理代码中 .我当前的设置(在MVC3上,但我认为它仍然适用)依赖于
ErrorController
,所以我使用:控制器包含以下内容:
而观点就是你实现它们的方式 . 我倾向于添加一些逻辑,以显示应用程序处于调试模式时的堆栈跟踪和错误信息 . 所以Error.cshtml看起来像这样:
我已经完成了pablo解决方案而且我总是遇到错误(MVC4)
要摆脱这个, remove the line
在FilterConfig.cs中
我做的事情需要的代码少于发布的其他解决方案 .
首先,在我的web.config中,我有以下内容:
控制器(/Controllers/ErrorPageController.cs)包含以下内容:
最后,视图包含以下内容(为简单起见,它被删除,但它可以包含:
就这么简单 . 它可以很容易地扩展,以提供更详细的错误信息,但ELMAH处理对我来说,statusCode和statusDescription是我通常需要的 .
我建议使用Global.asax.cs文件 .
这里似乎有许多步骤混杂在一起 . 我会提出我从头开始做的事情 .
ErrorPage
控制器为这两个操作添加视图(右键单击 - >添加视图) . 这些应出现在名为ErrorPage的文件夹中 .
内部
App_Start
打开FilterConfig.cs
并注释掉错误处理过滤器 .<customerErrors>
条目,在System.Web
下在maxspan发布的答案的基础上,我整理了一个显示所有工作部件的最小sample project on GitHub .
基本上,我们只是将
Application_Error
方法添加到 global.asax.cs 以拦截异常并让我们有机会将(或更准确地说,转移请求)重定向到自定义错误页面 .错误控制器:
错误页面查看:
除了在 FilterConfig.cs 中禁用/删除
filters.Add(new HandleErrorAttribute())
之外,不涉及任何其他内容虽然实现起来非常简单,但我在这种方法中看到的一个缺点是使用查询字符串将异常信息传递到目标错误页面 .
这是我的解决方案 . 在我看来,使用 [ExportModelStateToTempData] / [ImportModelStateFromTempData] 感到很不舒服 .
〜/查看/主页/ Error.cshtml:
〜/控制器/ HomeController.sc:
〜/控制器/ BaseController.sc:
〜/控制器/ MyController.sc:
祝你项目成功;-)
您可以在不破坏global.cs的情况下正确地处理错误,弄乱HandleErrorAttribute,执行Response.TrySkipIisCustomErrors,挂钩Application_Error或其他:
在system.web(只是通常,开/关)
并在system.webServer中
现在事情应该按预期运行,您可以使用ErrorController来显示您需要的任何内容 .
我似乎来晚了,但你最好还是检查一下 .
所以在
system.web
中进行缓存应用程序中的异常,例如返回HttpNotFound()并在
system.webServer
中捕获IIS捕获的错误,但没有进入asp.net框架在最后一个如果您担心客户端响应然后将
responseMode="Redirect"
更改为responseMode="File"
并提供静态html文件,因为这个文件将显示一个带有200响应代码的友好页面 .在web.config中,在system.webserver标记下添加,如下所示,
并添加一个控制器,
并添加他们尊重的视图,这绝对是我猜的所有 .
我找到了这个解决方案:Neptune Century