如何使用AJAX错误发出服务器端重定向

时间:2012-03-13 21:18:46

标签: asp.net asp.net-ajax

我有以下设置:

  1. Web.config有customErrors mode =“Off”
  2. Global.Application_Error()事件调用名为UtilitiesWeb.ProcessError()的自定义函数
  3. UtilitiesWeb.ProcessError()记录错误,然后使用以下命令重定向用户:HttpContext.Current.Response.Redirect(defaultErrorPage,false)
  4. 除了处理AJAX之外,这很适合作为一个好的全局错误处理程序。 AJAX在JavaScript中显示错误,并忽略重定向。

    要让页面重定向到AJAX错误,我必须执行以下操作:

    1. 将asp:ScriptManager更新为:< asp:ScriptManager ID =“scriptmanager1”runat =“server” 的 OnAsyncPostBackError = “ScriptManager1_AsyncPostBackError”>
    2. 添加调用UtilitiesWeb.ProcessError()的服务器端ScriptManager1_AsyncPostBackError方法
    3. 添加以下JavaScript以进行重定向,因为AJAX忽略了服务器端重定向:
    4. <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
          }
      }  
      

2 个答案:

答案 0 :(得分:3)

当您发出AJAX请求时,您只会获得包含某种数据的响应,这些数据由客户端的脚本解释。

因此,如果出现错误,服务器唯一能做的就是在响应中发送错误给ajax请求。

此时,客户端脚本会收到错误信息,您可以按照自己喜欢的方式使用它。你正在以正确的方式做到这一点。

但是,如果您需要采取一些额外的操作,例如记录错误,您有两个选择:

1)从javascript将错误发送回服务器:例如,您可以使用带有hidden类型的输入的aregular表单,设置输入值,并使用form.submti()将表单发布到您的错误页面。您的页面可以使用Page的Request对象恢复隐藏字段的内容并进行处理。

2)捕获服务器端的错误,在try / catch,page_error或application_error事件中,记录异常,或者你想用它做什么,然后抛出一个新的异常将到达客户端,隐藏原始的异常信息。

第二个选项更干净,更安全,因为您不会向浏览器发送错误信息。

认为服务器无法以任何方式重定向浏览器,因为当服务器向AJAX请求发送响应时,服务器不会为浏览器呈现新页面,并且浏览器没有收到新的整体页。服务器只是发送一些信息以供客户端脚本处理。因此,您的脚本负责重新加载新页面或您需要做的任何事情。

答案 1 :(得分:0)

  

这不是黑客攻击。您已经实施了正确的代码。