【问题标题】:Handling WebFaultException in jQuery AJAX call在 jQuery AJAX 调用中处理 WebFaultException
【发布时间】:2012-07-03 16:26:50
【问题描述】:

我有一些调用 WCF 服务的 jQuery。当服务遇到错误时,它会抛出带有描述和500 Internal Server Error 状态码的WebFaultException

客户端,我正在做一些事情:

$.ajax({
    url: BaseUrl + 'ThisShouldThrowAnException',
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: function (data) {
        // this should never be called
        alert("Got data: " + data);
    },
    error: function (jqXHR, status, message) { // never called
            // would like this to handle my status code
        alert(status + " " + message);
    }
});

在本地 IIS 服务器上,被调用的相应代码如下:

[OperationContract]
[WebGet(RequestFormat=WebMessageFormat.Json)]
bool ThisShouldThrowAnException();


public bool ThisShouldThrowAnException()
{
    throw new WebFaultException<String>("Something really bad happened.", HttpStatusCode.InternalServerError);
}

问题是当我进行这个调用时,成功的函数被调用了。 jQuery 似乎吞下了我的500 Internal Server Error,而是给了我一个200 OK。使用Fiddler 进行检查还显示我的响应状态代码是200 OK。当我通过浏览器拨打电话或手动提出请求时,我会收到相应的500 Internal Server Error

我的问题是:如何在 $.ajax(...) 调用中处理 WebExceptionFault?就目前而言,$.ajax 完全忽略了传递给它的任何状态代码。

我尝试使用ajaxErrorstatusCode,但都没有成功:

$('#error').ajaxError(function() {
    alert("An error occurred");
});

$.ajax({
    url: BaseUrl + 'ThisShouldThrowAnException',
    type: 'GET',
    dataType: 'jsonp',
    crossDomain: true,
    success: function (data) {
        alert("Got data: " + data);
    },
    statusCode: {
        500: function() {
            alert("Got 500 Internal Server Error");
        }
    },
    error: function (jqXHR, status, message) {
        alert(status + " " + message);
    }
});

新发现

进一步分析,当我检查 jQuery 生成的查询字符串时,我发现以下返回一个 200 OK

http://localhost/RestService/RestService.svc/ThisShouldThrowAnException?callback=jQuery172003801283869839445_1341495740773&_=1341495740777

// on page:
jQuery172003801283869839445_1341495740773("Something really bad happened.",500);

同时,以下请求返回500 Internal Server Error

http://localhost/RestService/RestService.svc/ThisShouldThrowAnException

// on page:
"Something really bad happened"

【问题讨论】:

  • 你有没有在你的错误函数中试过这个>>var msg = JSON.parse(jqXHR.responseText); alert(msg.Message);
  • 这不会改变任何事情。错误处理程序从一开始就不会被调用。
  • 抱歉误读了您的问题。我用这个 ajaxError 检查我的 url 是否有这样的问题: .ajaxError(function (e, xhr, settings, exception) { if (settings.url == "Default.aspx/GetDat") { alert('Url cannot被称为'); } });
  • 有一个属性叫ajaxError?我在文档中没有看到。

标签: c# jquery wcf exception-handling http-status-codes


【解决方案1】:

http://api.jquery.com/jQuery.ajax/

在数据类型部分,他们提到

jsonp类型附加一个callback=?的查询字符串参数?到 网址。服务器应将带有回调名称的 JSON 数据添加到 形成一个有效的 JSONP 响应。我们可以指定一个参数名 other 而不是使用 jsonp 选项回调到 $.ajax()。

当从远程服务器检索数据时(这是唯一可能的 使用脚本或 jsonp 数据类型)、错误回调和全局 永远不会触发事件。

这就是为什么您的错误回调没有触发并且直接转到成功回调的原因。

编辑:成功函数中的数据是什么样的?因为据我了解,从服务器返回的任何内容都作为数据传入。

这是一个使用 JSONP 使用 WCF Web 服务的示例。

http://bendewey.wordpress.com/2009/11/24/using-jsonp-with-wcf-and-jquery/

关键是,WCF 看到您正在请求 JSONP 数据,并且您提供了一个名为“回调”的查询字符串参数。因此,WCF 会自动返回 200 OK(无论实际状态如何)以及远程函数返回的任何数据。

进一步阅读 JSONP 的实际工作原理: http://devlog.info/2010/03/10/cross-domain-ajax/

如果您阅读 JSONP 的工作原理,您会意识到 jQuery 不太可能返回实际的错误状态,因为服务器本身不会返回它。

关于您当前的问题,请切换到 JSON 请求。如果这不可能,您可以随时检查 ajax 成功函数中的数据对象。当您返回它时,它将具有错误代码 500。

【讨论】:

    【解决方案2】:

    jsonp 请求不会触发错误处理程序。 jQuery ajax 文档对 error(jqXHR, textStatus, errorThrown) 有以下免责声明:

    注意: 跨域脚本和 JSONP 请求不调用此处理程序。

    如果您可以选择切换到 jsoncrossDomain=false,则应该触发错误处理程序。

    关于这个主题有一个类似的SO问题here

    This SO 问题建议在服务器上捕获任何错误,始终返回 200 并在有效负载中返回响应代码。

    【讨论】:

    • 您如何解释在 jQuery outside 发出的裸 Web 请求返回 HTTP 200 错误这一事实?在我使用 jQuery 之前,我已经遇到了问题,我的浏览器告诉我 200 OK 在请求中应该显示 500 错误。
    • 我只能猜测浏览器没有请求文本/json,所以你没有点击实际的 ThisShouldThrowAnException() 方法。我将通过对成功响应代码的评论来更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2012-11-25
    相关资源
    最近更新 更多