JSONP不会以https格式返回数据

时间:2013-05-06 11:52:49

标签: asp.net json https jsonp

我整个星期五都花在这上面,并且认为我星期一进来看看能不能得到一些帮助。以下是摘要:

我有两个网站,一个使用AJAX来调用另一个网站上的http处理程序来获取一个令牌(字符串)。我最初使用的json调用效果很好,但是当我访问的站点使用https时,不会返回数据。

我收到了200条成功消息,我使用http获取数据,但不是https。我在本地计算机上运行此问题。我验证如果我使用相同的URL,我的浏览器会返回数据。

此外,在https模式下,我设置了一个断点,看起来它甚至没有调用代码来传回令牌。

提前致谢!

         function onSuccessGetToken(token, url, type) {
         var getTokenUrl = url + "SSOtoken=" + token;

         //verify the URL is correct, for testing
         alert(getTokenUrl);

         $.ajax({
             url: getTokenUrl,
             contentType: "application/json; charset=utf-8",
             dataType: "json",
             success: function (msg) {
                 onSuccess(JSON.stringify(msg).replace(/\"/g, ""), url, type);
             },
             error: function (msg) {
                 //using jsonp, this always goes here, but no data is returned
                 alert(JSON.stringify(msg));
                 onErrorGetToken(msg);
             }
         });
     }

1 个答案:

答案 0 :(得分:1)

您尚未显示getTokenUrl包含的内容,但是从您的问题描述中我会说您正在遇到Same Origin Policy,这会阻止不同“来源”之间的ajax调用。注意“origin”不代表“domain”,不同的域名是不同的来源,但不同的协议(http vs. https),不同的端口(80 vs. {{1例如)等等。

在你的问题中,你谈论的是JSONP,但你没有使用JSONP。您可以使用JSONP来处理跨源请求,这就是它的用途。为此,请使用8080作为"jsonp",并确保服务器返回正确的JSONP响应(包括从查询字符串中获取JSONP回调的名称)。有关JSONP的更多信息,请参见the Wikipedia article on it

当您控制两个来源时,进行跨源调用的另一个策略是使用Cross-Origin Resource Sharing。这是您的服务器响应浏览器发送的“预检”请求的位置,该请求告诉浏览器服务器是否接受来自文档来源的调用。 Browser support这些日子在IE之外是非常好的。在IE9及更早版本中,它不受标准dataType对象(jQuery使用的对象)的支持。从IE10开始,他们终于做对了。


无关:您的XMLHttpRequest来电,您指的是ajax。这告诉服务器你发送的是JSON,而不是告诉jQuery将响应视为JSON。那是你要指定的另一个contentType: "application/json"(尽管配置正确的服务器,你不应该 - 服务器应该返回具有正确MIME类型的dataType标头)