我有以下设置:
除了处理AJAX之外,这很适合作为一个好的全局错误处理程序。 AJAX在JavaScript中显示错误,并忽略重定向。
要让页面重定向到AJAX错误,我必须执行以下操作:
<script type="text/javascript"> if (typeof (Sys) != 'undefined') { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequest); function endRequest(sender, e) { if (e.get_error()) { window.location = "ErrorPage.aspx" } } } </script>
但这一切似乎都是一种解决方法。有没有办法让服务器端重定向与AJAX错误一起使用?
为了完整性,这是UtilitiesWeb.ProcessError()的代码:
public static void ProcessError()
{
string defaultErrorPage = ConfigurationManager.AppSettings["DefaultErrorPage"];
string displayError = ConfigurationManager.AppSettings["DisplayError"];
Exception ex;
if (!string.IsNullOrWhiteSpace(displayError))
displayError = displayError.ToLower();
ex = HttpContext.Current.Server.GetLastError();
if (ex != null)
Log.LogException(DateTime.Now, null, ex);
// Redirect to Default Error page on error
if (displayError == "basic")
{
HttpContext.Current.Server.ClearError(); // needed for redirect to work
if (!string.IsNullOrWhiteSpace(defaultErrorPage))
HttpContext.Current.Response.Redirect(defaultErrorPage, false); // doesn't work with AJAX calls
}
}
答案 0 :(得分:3)
当您发出AJAX请求时,您只会获得包含某种数据的响应,这些数据由客户端的脚本解释。
因此,如果出现错误,服务器唯一能做的就是在响应中发送错误给ajax请求。
此时,客户端脚本会收到错误信息,您可以按照自己喜欢的方式使用它。你正在以正确的方式做到这一点。
但是,如果您需要采取一些额外的操作,例如记录错误,您有两个选择:
1)从javascript将错误发送回服务器:例如,您可以使用带有hidden类型的输入的aregular表单,设置输入值,并使用form.submti()将表单发布到您的错误页面。您的页面可以使用Page的Request对象恢复隐藏字段的内容并进行处理。
2)捕获服务器端的错误,在try / catch,page_error或application_error事件中,记录异常,或者你想用它做什么,然后抛出一个新的异常将到达客户端,隐藏原始的异常信息。
第二个选项更干净,更安全,因为您不会向浏览器发送错误信息。
认为服务器无法以任何方式重定向浏览器,因为当服务器向AJAX请求发送响应时,服务器不会为浏览器呈现新页面,并且浏览器没有收到新的整体页。服务器只是发送一些信息以供客户端脚本处理。因此,您的脚本负责重新加载新页面或您需要做的任何事情。
答案 1 :(得分:0)
这不是黑客攻击。您已经实施了正确的代码。