MVC Generic error view and Ajax Post and error code 500
我已经设置了一个带有_error.cshtml的mvc应用程序,该应用程序设置为捕获我在控制器中抛出的异常。
我在一些检查错误的页面上也有一些ajax帖子,然后它会做其他事情。
在服务器上,我有一个关于所有异常的过滤器,然后检查它是否是一个ajax请求并返回可以在客户端上反序列化的东西。 问题是如果我没有将post响应状态代码设置为500,那么ajax将不会看到此错误,我无法显示一条好消息。 如果我将状态设置为500,我会收到默认的IIS错误消息,说明服务器上发生了什么。
我想在ajax结果中处理页面上的一些错误,但保持一般的错误处理。 这是一个IIS设置,允许每个站点自定义500条消息吗? web.config自定义错误开|关在我的情况下没有任何区别。
您检查其是否为ajax请求的所有异常的过滤器是否是您自己创建的过滤器?
我有一个类似的问题,我必须确保标志TrySkipIisCustomErrors设置为true,以避免标准的IIS错误。
此标志位于HttpContext的Response对象上。
这也是由标准的HandleError过滤器完成的,注意其OnException方法实现的最后一行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | public virtual void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } if (filterContext.IsChildAction) { return; } // If custom errors are disabled, we need to let the normal ASP.NET exception handler // execute so that the user can see useful debugging information. if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) { return; } Exception exception = filterContext.Exception; // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method), // ignore it. if (new HttpException(null, exception).GetHttpCode() != 500) { return; } if (!ExceptionType.IsInstanceOfType(exception)) { return; } string controllerName = (string)filterContext.RouteData.Values["controller"]; string actionName = (string)filterContext.RouteData.Values["action"]; HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); filterContext.Result = new ViewResult { ViewName = View, MasterName = Master, ViewData = new ViewDataDictionary<HandleErrorInfo>(model), TempData = filterContext.Controller.TempData }; filterContext.ExceptionHandled = true; filterContext.HttpContext.Response.Clear(); filterContext.HttpContext.Response.StatusCode = 500; // Certain versions of IIS will sometimes use their own error page when // they detect a server error. Setting this property indicates that we // want it to try to render ASP.NET MVC's error page instead. filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; } |