web服务调用的同源问题

本文关键字:问题 服务 调用 web | 更新日期: 2023-09-27 18:20:25

我的web服务器在http://mypc.com:80上运行`

给定以下剪切:

$(window).load(function () {
    var myURL = "http://mypc.com:8000/PSOCharts/service/HighChart_ColumnChart/i";

    $.getJSON(myURL)
        .done(function(data) {alert(data);});
    });

我正在运行此错误:

XMLHttpRequest无法加载http://mypc.com:8000/PSOCharts/service/HighChart_ColumnChart/i.起源http://mypc.com访问控制允许来源不允许。

我理解为什么(我认为)b/c我的Web服务运行在8000端口,这与IIS运行的端口(80端口)不同。

我想我可以使用jsonp(根据这里的jQuery文档

所以我复制了一个调用flickrAPI的例子,但它不起作用。有什么想法/建议吗?

更新

好的,所以我的请求现在正在提出:

var myURL = "http://192.168.1.104:8000/PSOCharts/service/HighChart_ColumnChart/i?jsoncallback=?";
    $.ajax({
        url :myURL,
        dataType: "jsonp",
        success: function(data) {a(data)} ,
        error: function(){alert("err");},
        });

但我不断地点击错误函数,以下是返回的内容:

[1.4,54.43,49.39,93.23]

现在我假设这是b/c响应文本不包含任何类型的回调

这是我调用的接口的一部分:

 [WebInvoke(Method = "GET",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "HighChart_ColumnChart/{id}?callback={cb}")]
    List<double> HighChart_ColumnChart(string id,string cb);

这是被调用的实际函数:

  public List<double> HighChart_ColumnChart(string id,string cb)
    {
        var z = new List<double>();
        z.Add(1.4);
        z.Add(54.43);
        z.Add(49.39);
        z.Add(93.23);
        return z;
    }

调试时,CB参数类似于:"jQuery19108121746340766549_1372630643878"。如何修改代码以正确包装它?感谢迄今为止的帮助!

web服务调用的同源问题

如果使用jsonp,则必须修改服务器的响应,以便将json数据封装在回调查询字符串参数指定的方法中。

因此,如果您的服务器返回类似以下内容:

["test1", test2]

它将变成:

callback(["test1", "test2"]);

其中"回调"由jquery在您的"webservice"的查询字符串中指定

编辑:给定您的示例代码,我认为您需要手动序列化和包装您的响应。MVC有一个Jsonp-helper方法,我在.NET4WCF中看到报告称,WCF将根据存在的回调参数为您执行此操作,但如果不起作用,请在方法末尾添加以下内容。

JavaScriptSerializer s = new JavaScriptSerializer();
    string jsonString = s.Serialize(z);
    return WebOperationContext.Current.CreateTextResponse(string.Format("{0}({1});", cb, jsonString), "application/json; charset=utf-8", Encoding.UTF8);

(从这里修改:使用JQuery和WCF连接JSONP)

如果您尝试使用jsonp,请确保以下情况之一:

  • 如果使用的是$.get,则将dataType设置为jsonp
  • 如果您使用的是$.getJSON,并且URL中包含了callback=?