jQuery AJAX响应总是不返回任何内容

时间:2011-02-25 16:44:31

标签: ajax web-services jquery asp.net-3.5

以下代码返回空白响应,无论函数是否存在,甚至完全是Web服务文件:

$.ajax({
    url: "/ws.asmx/HelloWorld"
    , type: "POST"
    , contentType: 'application/json; charset=utf-8'
    , data: '{ FileName: "' + filename + '" }'
    , dataType: 'json'
    , success: function (data) {

    }
});

为什么会这样?

另外,值得注意的是,$.load()工作正常!

7 个答案:

答案 0 :(得分:4)

您的错误是您尝试手动构建JSON数据并以错误的方式执行此操作:

'{ FileName: "' + filename + '" }'

您应该至少将代码修改为以下

'{ "FileName": "' + filename + '" }'

因为对应于JSON specification,属性名称也必须加双引号。

如果filename有一些特殊字符,你可以遇到下一个问题。例如,在

的情况下
var filename = '"C:\\Program Files"'; // the '\' must be escaped in the string literal

您应该将相应的JSON字符串作为数据

'{ "FileName": "\\"C:\\\\Program Files\\"" }'

作为相应的JSON数据,因为'\'和'''必须被转义。它看起来很难。所以我强烈建议你构建尊重JSON字符串来自JSON.stringifyjson2.js函数。然后代码将是

$.ajax({
    type: "POST",
    url: "ws.asmx/HelloWorld",
    data: JSON.stringify({ FileName: filename }),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (data) {
        alert(data.d);
    },
    error: function (XMLHttpRequest, textStatus, errorThrown) {
        alert("Error Occured!" + " | " + XMLHttpRequest.responseText +
               " | " + textStatus + " | " +  errorThrown);
    }
});

简单明了。使用JSON.stringify的下一个优点是,最现代的Web浏览器具有原生支持该功能,并且功能可以非常快速地工作。

顺便说一下,如果使用JSON.stringify,您可以轻松调用具有非常复杂的数据结构(类)作为参数的Web服务方法,而不仅仅是字符串。

更新:还有一个减少可能的误解的remrk。您稍后使用HTTP GET而不是HTTP POST来调用Web方法,您必须从

更改data参数
JSON.stringify({ FileName: filename })

{ FileName: JSON.stringify(filename) }

更新2 :在我发布回答之前,您可以下载this Visual Studio 2010项目。我在.NET 3.5中包含了“Web-3.5.config”web.config。 default.htm工作中包含的所有不同注释data值。如果您希望使用HTTP GET进行make测试,则应取消注释web.config中允许HttpGet并使用ScriptMethod UseHttpGet = true的部分。所有行都作为注释包含在演示中。

答案 1 :(得分:2)

只是尝试使用:

$.getJSON("/ws.asmx/HelloWorld", function(data){
   alert(data);
});

检查您是否收到了数据。

答案 2 :(得分:1)

答案 3 :(得分:0)

确保已正确加载jquery.js文件。

答案 4 :(得分:0)

服务是否返回值?如果没有,它只会POST而不会给你任何回报,因为没有数据可以看......

答案 5 :(得分:0)

如果您想查看错误,可以添加错误回调

$.ajax({
    url: "/ws.asmx/HelloWorld"
    , type: "POST"
    , contentType: 'application/json; charset=utf-8'
    , data: '{ FileName: "' + filename + '" }'
    , dataType: 'json'
    , success: function (data) {

    }
    , error: function (a, b, c) {

    }
});

来自jQuery:

error(jqXHR, textStatus, errorThrown)Function 

A function to be called if the request fails. The function receives
     

三个参数:jqXHR(在jQuery中   1.4.x,XMLHttpRequest)对象,描述错误类型的字符串   发生了并且是可选的   异常对象,如果发生了一个。   第二个可能的值   参数(除了null)是“超时”,   “错误”,“中止”和“parsererror”。   这是一个Ajax事件。截至jQuery   1.5,错误设置可以接受一系列功能。每个功能都会   被轮流打电话。注意:这个处理程序   没有调用跨域脚本   和JSONP请求。

答案 6 :(得分:0)

我在某处读到POST 的内容类型标题必须

  xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

我盲目地使用它:它总是有效。

- 皮特