我有一个返回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
答案 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支持适当地发出回调。
答案 2 :(得分:0)
很抱歉迟到了 - 你不必使用jsonp,我使用WCF与angularjs,jquery,移动应用程序等 - 并且从不使用jsonp。
只需装饰您的类和属性,如下所示,它将序列化。
[DataContract]
public class MyCustomClass
{
[DataMemember]
public string Name { get; set;}
}