为什么同一域ajax请求添加jsonp回调参数?

时间:2011-02-25 17:38:07

标签: asp.net ajax json jquery

好的,这应该是一个相当简单的问题,我可能遗漏了一些明显的东西。 我有一个简单的脚本向服务器发出请求:

var DTO = { 'path': path };
var url = 'default.aspx/Get'; 

 var test;
$('#getInstance').click(function () {
            $.ajax({
                url: url,
                type: 'POST',
                dataType: 'json',
                data: JSON.stringify(DTO),
                contentType: 'application/json; charset=utf-8',
                success: function (msg) {                    
                    test = msg;
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    alert(textStatus);
                    alert(errorThrown);
                }
            });

        });

这很好,因为它连接到服务器并获取数据,只有一个简单的问题。它将此请求视为跨域请求,因此使用jsonp。 服务器代码在这里:

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public static MyObject Get(string path)
    {
        MyObject foo = new MyObject();

        return foo;
    }

通常这不是问题,除了我正在访问WebMethod,它没有能力返回jsonp响应(意味着它无法将回调函数附加到响应。现在,如果这是一个人工响应,我可以破解并附加参数,但我正在利用内置的序列化,所以没办法搞清楚响应。

帮助澄清。该页面位于:

http://127.0.0.1:144/default.aspx

并且在firebug中看到的请求是:

http://127.0.0.1:144/default.aspx/Get?callback=jQuery1502768168154247801_1298656485388

让我强调一下这段代码的作用。唯一的问题是jQuery将此请求视为跨域。但是为什么?

更新:嗯,经过更多时间和更多测试后,我已将此问题缩小到jquery 1.5.1中的错误。我使用旧版本(所有1.4版本)进行了一些测试,我没有遇到任何问题,请求是使用JSON进行的,并且响应已成功收到。他们将这个请求视为CORS的变化是什么?

2 个答案:

答案 0 :(得分:9)

经过一番研究,终于确定了这个问题。如我上次更新中所示,该问题与使用jQuery 1.5版本有关。当我没有想法时,我尝试了之前的jQuery版本,你知道什么,它按预期工作。

当我准备提交错误报告时,我搜索了错误数据库,发现了一些匹配相同行为的错误报告。事实证明这是影响新jQuery版本的jQuery验证插件中的一个错误。

I posted a blog entry with an explanation

答案 1 :(得分:0)

尝试在$ .ajax()调用中明确将crossDomain设置为false:

$.ajax({
  crossDomain: false,
  // The rest of your options here.
});