【发布时间】:2018-06-29 14:07:20
【问题描述】:
当我的应用程序在 AJAX 请求期间遇到 UnauthorizedAccessException 类型的异常时,我想自己处理该行为并返回自定义 JSON 响应。
所以我在基本控制器中重写了OnException 方法,我的所有控制器都继承自该方法,如下所示:
protected override void OnException(ExceptionContext filterContext)
{
var exception = filterContext.Exception;
if (exception is UnauthorizedAccessException)
{
filterContext.ExceptionHandled = true;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.Unauthorized;
filterContext.HttpContext.Response.ContentType = "application/json";
JavaScriptSerializer serializer = new JavaScriptSerializer();
string json = serializer.Serialize(new { IsUnauthenticated = true });
filterContext.HttpContext.Response.Write(json);
filterContext.HttpContext.Response.End();
}
else
{
filterContext.Result = RedirectToAction("LogOut", "Account");
}
}
else
{
// Allow the exception to be processed as normal.
base.OnException(filterContext);
}
}
现在这几乎完全符合我的要求。如果在 AJAX 请求期间发生异常,我的 JavaScript 将根据需要获取正确的 JSON 对象。
但是,问题是应用程序随后在内部遭受HttpException,并带有消息:
发送 HTTP 标头后无法重定向。
还有来自异常的堆栈跟踪:
在 System.Web.HttpResponse.Redirect(字符串 url,布尔值 endResponse,布尔值永久) 在 System.Web.Security.FormsAuthenticationModule.OnLeave(对象源,EventArgs eventArgs) 在 System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep 步骤) 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
当向MvcApplication 的Application_Error 方法添加断点时,我得到了这个异常信息,如下所示:
protected void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
LogError(ex);
}
因此,尽管我的应用程序在用户体验方面完全符合我的要求。我真的不想发生这种“幕后”异常。
这里出了什么问题?我能做些什么来防止异常的发生?
【问题讨论】:
-
您确定
Application_Error是个问题吗?如果您评论它,错误会消失吗? -
哦,我误会你了,对不起!你的
Application_Error很好。 -
您能否澄清一下,当您的控制器抛出
UnauthorizedAccessExceptionANDfilterContext.HttpContext.Request.IsAjaxRequest()是false时,您会得到这个HttpException? -
对不起,musefan,我无法为 Ajax 请求和重定向进行复制。我总能得到想要的结果。您的错误字面意思是它所说的内容,因此您必须也在代码中的其他地方发送响应,或者您在错误处理程序的响应之后重定向。
-
@vasily.sib:它发生在 ISAjaxRequest 为真的代码之后。但是,我不知道是什么扔了它。 VS 中的调用堆栈在异常时为空。不过,我会在问题中添加异常堆栈跟踪......
标签: c# asp.net-mvc exception-handling