Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在jQuery AJAX调用中处理WebFaultException_C#_Jquery_Wcf_Exception Handling_Http Status Codes - Fatal编程技术网

C# 在jQuery AJAX调用中处理WebFaultException

C# 在jQuery AJAX调用中处理WebFaultException,c#,jquery,wcf,exception-handling,http-status-codes,C#,Jquery,Wcf,Exception Handling,Http Status Codes,我有一些jQuery可以调用WCF服务。当服务遇到错误时,它会抛出一个带有说明的WebFaultException,以及一个500内部服务器错误状态代码 客户方面,我正在做以下工作: $.ajax({ url: BaseUrl + 'ThisShouldThrowAnException', type: 'GET', dataType: 'jsonp', crossDomain: true, success: function (data) {

我有一些jQuery可以调用WCF服务。当服务遇到错误时,它会抛出一个带有说明的
WebFaultException
,以及一个
500内部服务器错误
状态代码

客户方面,我正在做以下工作:

$.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生成的查询字符串时,我发现以下内容返回一个
200OK

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

// on page:
jQuery172003801283869839445_1341495740773("Something really bad happened.",500);
同时,以下请求返回
500内部服务器错误

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

// on page:
"Something really bad happened"

错误处理程序不会为jsonp请求触发。文档中有以下关于错误的免责声明(jqXHR、textStatus、ERRORSHORN)

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

如果您可以选择切换到jsoncrossDomain=false,则应启动错误处理程序

在这个话题上有一个类似的问题

所以这个问题建议捕获服务器上的任何错误,总是返回200并在有效负载中返回响应代码。

在“数据类型”一节中,他们提到

jsonp类型附加了一个查询字符串参数callback=?到 网址。服务器应该在JSON数据前面加上回调名称,以便 形成有效的JSONP响应。我们可以指定另一个参数名 然后使用jsonp选项回调$.ajax()

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

这就是为什么你的错误回调没有被触发,它直接进入成功回调

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

下面是一个使用JSONP使用WCF Web服务的示例

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

进一步阅读JSONP的实际工作原理:

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


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

您是否在错误函数>>var msg=JSON.parse(jqXHR.responseText)中尝试过这个操作;警报(消息);这不会改变什么。从一开始就没有调用错误处理程序。很抱歉误读了您的问题。我使用这个ajaxError来检查我的url是否有这样的问题:.ajaxError(函数(e,xhr,settings,exception){If(settings.url==“Default.aspx/GetDat”){alert('url无法调用');});有一个属性名为
ajaxError
?我在文档中没有看到这一点。您如何解释在jQuery之外发出的裸web请求返回HTTP 200错误的事实?在我开始使用jQuery之前,我已经遇到了一些问题,我的浏览器告诉我请求时
200 OK
应该显示500错误。我只能猜测浏览器没有请求text/json,因此您没有使用实际的ThisShouldThrowAnException()方法。我将更新我的答案,并对成功中的响应代码进行评论。
http://localhost/RestService/RestService.svc/ThisShouldThrowAnException

// on page:
"Something really bad happened"