2011-02-25 57 views
3

好吧,这应该是一个相当简单的问题,我可能错过了一些明显的东西。 我有一个简单的脚本向服务器请求:为什么相同的域ajax请求添加jsonp回调参数?

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

和看到萤火虫的要求是:

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

我只想强调,这代码工作的事实。唯一的问题是jQuery将此请求视为跨域。但为什么?

更新:好吧,在经过了更多的时间和更多的测试之后,我将这个问题缩小到它是jquery 1.5.1中的一个错误。我用旧版本(所有1.4版本)做了一些测试,并且没有问题,请求是使用JSON完成的,并且响应被成功接收。他们所做的改变可能会将这个请求视为CORS?

+0

您是否尝试过完整的uri? (即'http:// domain.com/default.aspx/Get') – 2011-02-25 17:50:39

+0

@ artyom.stv是的,我可以在Firebug中看到它是同一个域。编辑的问题显示如此。 – Victor 2011-02-25 17:53:34

+0

尝试删除'charset = utf-8'。可能吗? – 2011-02-25 18:16:33

回答

9

一些调查研究后,终于确定了这个问题。正如我上次更新中指出的那样,这个问题与使用jQuery 1.5版本有关。当我用完想法之后,我尝试了以前的jQuery版本,并且您会知道什么,它按预期工作。

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

I posted a blog entry with an explanation

+0

谢谢。好工作维克多! – Dirk 2011-03-19 18:22:57

+0

上帝我刚刚花了这个问题的最后30分钟。 TY Victor找出原因 – Lee 2011-09-10 16:00:59

+0

警告! Google Chrome告诉我:“** www.victorocastro.com **包含恶意软件,如果您访问本网站,您的计算机可能会发现病毒。” – hippietrail 2012-08-10 17:11:36

0

尝试在$就明确设置crossDomain为false()调用:

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

这应该只用于将'crossDomain'设置为'true' – 2011-02-25 18:54:12

+0

这只适用于强制本地域的crossDomain(jsonp)请求。 – Victor 2011-02-25 21:03:22

相关问题