WCF Web服务和getJSON返回空数据以进行跨域调用

时间:2013-01-22 01:01:02

标签: c# jquery asp.net-mvc wcf rest

我有一个返回JSON格式数据的WCF服务。当我使用Web浏览器时,我可以很容易地看到结果,但是当使用Jquery getJSON时,我无法让它工作。我可以在提琴手中看到它正在返回数据,但在firebug中它显示红色字体和空响应。

这是我的WCF服务

[OperationContract]
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "GetUrl/{iType}")]
String GetUrl(string iType);



    public String GetUrl(string iType)
    {

            return strurl;
        }

MY JSON调用看起来像这样

    $.getJSON("http://localhost/UrlSvc/UrlService.svc/GetUrl/1",
function (data) {
    console.log("Data JSOn Got");
    $.each(data.items, function (i, item) {
        console.log("Data Received");
    });
});

当我把这个网址放在浏览器中时,我会按照预期得到以下内容

{"GetChartUrlResult":"ulr_fdba9bc2-7ff7-467f-a6e0-6f4d234169d2.png"}

但是getJSOn返回空响应,如在自己的网址上用红色字体看到的Firebug中所示。 这是一个跨域调用,我启用了跨域WCF

3 个答案:

答案 0 :(得分:3)

浏览器不允许跨域AJAX调用并阻止XMLHTTPRequest发生到任何域,而是加载包含脚本或页面的域。

要解决此问题,您可以使用JSONP调用在javascript中包装AJAX响应。您将以下查询字符串条目添加到您的请求:

callback=?

另请注意,如果您使用的是WCF,则需要在服务中启用JSONP。您可以通过在配置文件中将crossDomainScriptAccessEnabled属性设置为true来执行此操作:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webScriptEndpoint>
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
    </webScriptEndpoint>
  </standardEndpoints>
</system.serviceModel>

可以找到有关JSONP和WCF的更多信息here

答案 1 :(得分:1)

如果呼叫是跨域的,则必须使用jsonp。通过向网址添加$.getJSON,可以将其与?callback=?一起使用(具体取决于服务器端API)。确保您的API支持适当地发出回调。

此处的文档:http://api.jquery.com/jQuery.getJSON/

答案 2 :(得分:0)

很抱歉迟到了 - 你不必使用jsonp,我使用WCF与angularjs,jquery,移动应用程序等 - 并且从不使用jsonp。

只需装饰您的类和属性,如下所示,它将序列化。

[DataContract]
public class MyCustomClass
{
   [DataMemember]
   public string Name { get;  set;}
}