不在生产服务器上调用OnException

时间:2014-08-15 12:15:20

标签: asp.net-mvc asp.net-mvc-4 error-handling

我有一个MVC 4应用程序,其中基本控制器会覆盖OnException方法,如下所示。在开发过程中一切正常(IIS Express 8.5),但是一旦将应用程序部署到生产环境(2012 R2 / IIS 8.5),就不会调用该方法。用户看到标准的YSOD错误消息。

public override void OnException(ExceptionContext filterContext)
{
   //Code here
}

我已确认两个应用程序的web.config文件完全相同。 web.config文件的CustomErrors部分设置为“On”

   <customErrors mode="On" />

我非常仔细地比较了应用程序文件,并且部署中没有差异。我期待这个问题出现在IIS设置中,我似乎无法通过谷歌或通过四处寻找。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

OnException方法中引发的异常可能会导致应用程序的行为就像没有调用该方法一样。我有问题的实现包括调用将错误消息保存到自定义Windows错误日志,但是分配给IIS应用程序池标识的执行权限不足以创建新的事件日志源。删除日志记录逻辑后,问题就解决了。这是详细信息。 (一旦我证明这是有效的,我已经添加了记录逻辑。)

这对我有用:

首先,确保正确配置了web.config。需要注意的两个片段是:

<system.web> <customErrors mode="On" /> </system.web>

<system.webServer> 
     <httpErrors errorMode="DetailedLocalOnly" />
</system.webServer>

其次,以下内容位于我的基本控制器中,应用程序中的所有其他控制器都从该控制器继承:

        protected override void OnException(ExceptionContext filterContext)
        {
            if (filterContext.ExceptionHandled)
            {
                return;
            }

            filterContext.Result = Error(filterContext.Exception.Message,filterContext.Exception.StackTrace);
            filterContext.ExceptionHandled = true;
        }

        public ActionResult Error(string Message, string StackTrace, string ReturnUrl)
        {                 
            ViewBag.ErrorMessage = Message;
            ViewBag.StackTrace = StackTrace;
            ViewBag.ReturnUrl = ReturnUrl;

            return View("~/Views/Shared/MyError.cshtml");
        }