ASP.NET中的jQuery ajax with customErrors mode =“On”

时间:2010-04-21 13:07:12

标签: c# asp.net jquery

任何想法如何在执行时检索服务器端抛出的原始异常 ajax使用jQuery调用并使用

  

customErrors mode =“On”

web.config中的

如果mode =“Off”,我可以使用此功能获取错误:

error: function(xhr, status, error) {
        var error = JSON.parse(xhr.responseText); 
        alert(error.Message);
}

2 个答案:

答案 0 :(得分:1)

最好的办法是将服务器方法移动到具有自己的web.config的其他主机中。如果您以前从未这样做过,ASP.NET Web Services是一个很好的起点。

如果这不可行,您可以将整个服务器方法包装在try ... catch中并修改方法,以使其成功返回值包含异常信息。这有一些缺点:您必须修改$.ajax success处理程序以手动检查错误,并且您只捕获服务器方法中发生的异常(但您会错过http超时,DNS解析错误等。)。

答案 1 :(得分:1)

我遇到了同样的问题,发现了一些不同的解决方案:

您可以在web.config中禁用特定位置的客户端错误。

<location path="ajaxReuests">
  <system.web>
    <customErrors mode="Off" />
  </system.web>
</location>

但是,请在禁用自定义错误时注意客户错误security vunerability

另一个(更安全的解决方案)是在错误页面上使用ajax-complete-callback-handler和meta标签来检测错误并将响应转发给“正常”错误函数。为此,您需要在自定义错误页面上包含错误状态代码,例如:

<head runat="server">
  <title>Oops</title>
  <link href="/css/default.css" rel="stylesheet" type="text/css" />
  <meta name="statuscode" content="500" />
  ...

然后,您可以从XmlHttpRequest.responsText中解析出状态代码,并在检测到错误的状态代码时调用正常的错误函数。

$.ajax({

  url: '/ajax/mydata.ashx',
  dataType: 'json',

  complete: function(XMLHttpRequest, textStatus) {
    var statuscodeRegex = /content="(.*?)"/;
    if (statuscodeRegex.test(XMLHttpRequest.responseText) &&
      statuscodeRegex.exec(XMLHttpRequest.responseText)[0] != 200)
      this.error(XMLHttpRequest, textStatus, "Oh no... an error!");
  },

  success: function(myData) {
    //Do something useful...
  },

  error: function(XMLHttpRequest, textStatus, errorThrown) {
    //Error...
  }
});