当我的ASP.NET MVC 4应用程序发生错误时,我想根据错误类型为用户自定义视图。例如,找不到页面或发生异常(包含有关异常的一些用户友好的详细信息)。我已经在StackOverflow和其他在线资源上检查了其他如何执行此操作的示例,但没有一个答案对我有用。
VS2012中的基本[HandleError]属性似乎不适用于面向.NET 4.5的MVC 4应用程序。这是我家控制器中的代码:
[HandleError]
public ActionResult Index()
{
Response.TrySkipIisCustomErrors = true; //doesn't work with or without this
throw new NullReferenceException("Uh oh, something broke.");
}
它只是抛出一个异常,我希望由于[HandleError]属性而返回默认的〜/ Shared / Error.cshtml视图,但我得到的是HTTP 500内部服务器错误,表明该页面无法显示。我检查了我的web.config,不同的配置似乎表现得很奇怪。在该部分中,它目前包含:
<customErrors mode="On" />
(我尝试添加defaultRedirect并使用customErrors mode =“Off”但是没有任何效果...我正在渲染共享的错误视图或CustomError视图。如果我更改customErrors模式关闭,然后我可以按预期看到异常细节,所以它正在抛出“呃哦,有点破坏”的例外。
我也尝试将一个OnException处理程序添加到HomeController中,虽然我可以调试并看到正在引发OnException事件,但它没有任何区别:
protected override void OnException(ExceptionContext filterContext)
{
base.OnException(filterContext);
filterContext.ExceptionHandled = true;
if (filterContext == null)
{
filterContext.Result = View("CustomError");
return;
}
Exception e = filterContext.Exception;
// TODO: Log the exception here
ViewData["Exception"] = e; // pass the exception to the view
filterContext.Result = View("CustomError");
}
我也尝试更改[HandleError]来指定视图,但这似乎也没有做任何事情:
[HandleError(View="CustomError")]
非常感谢任何帮助。如果您需要更多详细信息,请与我们联系。
答案 0 :(得分:5)
我还进行了一个无休止的旅程,阅读SO答案和各种博客帖子试图让自定义错误页面工作。以下是最终为我工作的内容。
第一步是使用IIS Express进行调试,而不是内置的Cassini Web服务器,以“保证”调试体验将反映实时环境。
创建一个控制器来处理应用程序错误,并为您将处理的每个自定义错误添加一个操作。该操作应该执行任何日志记录,设置状态代码并返回视图。
public class ErrorsController : Controller
{
// 404
[HttpGet]
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
// I also have test actions so that I can verify it's working in production.
[HttpGet]
public ActionResult Throw404()
{
throw new HttpException((int)HttpStatusCode.NotFound, "demo");
}
}
配置web.config中的customErrors
部分以重定向到自定义错误操作。
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="Errors/InternalServerError">
<error statusCode="400" redirect="Errors/BadRequest" />
<error statusCode="403" redirect="Errors/Forbidden" />
<error statusCode="404" redirect="Errors/NotFound" />
<error statusCode="500" redirect="Errors/InternalServerError" />
</customErrors>
将httpErrors
部分添加到system.webServer
并在web.config中将errorMode设置为Detailed。为什么这对我来说是一个谜,但这是关键。
<system.webServer>
<httpErrors errorMode="Detailed" />
在定义的路线上添加最后一条路线,将404s定向到自定义页面。
// catchall for 404s
routes.MapRoute(
"Error",
"{*url}",
new {controller = "Errors", action = "NotFound"});
您可能还想创建自定义HandleErrorAttribute
并将其注册为全局过滤器,以记录500个错误。
这些步骤适用于开发(IIS Express)和生产(IIS7)环境。您需要更改customErrors mode="On"
以查看开发中的效果。
答案 1 :(得分:4)
我似乎记得你必须从非本地主机IP地址(通常是另一台计算机)调用该页面。它必须是基于IIS的服务器,而不是内置的开发服务器(所以IIS或IIS Express,但是你必须配置IIS Express进行外部访问,这很痛苦)。
您实际上可以对其进行调试,您必须在调试计算机上配置本地服务器以接受外部请求,然后从远程服务器调用本地服务器。
答案 2 :(得分:1)
尝试将以下属性添加到customErrors
标记:
defaultRedirect="Error"
这明确定义了MVC应该在抛出错误时重定向用户的视图,并且默认情况下不在属性中指定视图。这当然仅在Error.cshtml
views文件夹中存在Shared
时才有效。
答案 3 :(得分:1)
我遇到了类似的问题,并且在某些时候试图弄清楚发生了什么。所以,如果其他任何人遇到类似的问题,那就是我的问题。
错误页面试图使用我的_Layout页面。只需确保您的Error.cshtml页面有
@ { Layout = null; }