使用 jQuery ajax 调用 WCF 服务
Posted
技术标签:
【中文标题】使用 jQuery ajax 调用 WCF 服务【英文标题】:Calling a WCF service with jQuery ajax 【发布时间】:2014-07-08 12:47:04 【问题描述】:我创建了一个 WCF 服务,其方法声明如下
[OperationContract]
[WebInvoke(UriTemplate="getDashBoard", Method="POST", BodyStyle=WebMessageBodyStyle.WrappedRequest, RequestFormat=WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)]
getDashBoard object (string strGroups);
返回一个
List<Dictionary String, Object> rows = new List<Dictionary String, Object>();
由 javascriptSerializer 序列化
serializer.Serialize ( rows) ;
客户端我这样调用webservice方法
$.ajax (
type: " POST" ,
url: url ,
headers : " Access -Control- Allow- Origin" , " *", " Access -Control- Request- Method" , " POST ",
dataType : " json " ,
contentType : "application / json ; charset = utf -8" ,
date : ' " strGroups ": " ISPB " ' ,
success : function ( data)
var content = JSON.parse ( data);
$.each(content, function(i, item)
console.log(i) ;
);
,
error: function (jqXHR, textStatus, errorThrown)
alert(" getDashBoard " + textStatus) ;
);
对于 Firefox,对 WS 的调用会返回此错误“NetworkError:405 Method Not Allowed。锁定请求多源(跨源):源的标准不允许读取远程资源 http://.. ..您可以解决问题...通过在同一域上移动资源或激活CORS。”
使用调试器 IE 返回的数据显示格式正确,并且对象“内容”具有所有正确的值但循环不起作用:它返回“字符无效”
帮助meeeeee! 我很绝望:o
感谢辛齐亚
【问题讨论】:
【参考方案1】:非常感谢您的回答。 问题是,即使我在同一个域上工作,我也有同样的错误“SCRIPT1014:无效字符”
$.each(content, function(i, item)
console.log(i) ;
);
如果我删除有关循环的行代码,IE 会显示数据返回如下:
["Descr":"Altro","percValore":0.003,"Descr":"altro 2","percValore":0.100]
看来是对的!!! FireFox 什么都不显示! 也许问题不是跨域而是响应? 谢谢Cinzia
【讨论】:
【参考方案2】:您必须在服务器站点上的 WCF 服务上激活 CORS
。 CORS 用于绕过same-origin-policy。 Here 是一个很好的资源。
基本上,您首先必须添加一个消息检查器,然后您必须将 CORS-Heder 添加到响应中:
requiredHeaders.Add("Access-Control-Allow-Origin", "*");
requiredHeaders.Add("Access-Control-Request-Method", "POST,GET,PUT,DELETE,OPTIONS");
requiredHeaders.Add("Access-Control-Allow-Headers", "X-Requested-With,Content-Type");
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new CustomHeaderMessageInspector(requiredHeaders));
IE 和 FF 中的不同行为来自 FF (description) 的预检 OPTIONS
调用。如果您在 WCF 服务上启用 CORS(如上所述),它应该可以在两种浏览器中使用。
作为替代方案,您可以在同一个域上运行服务调用,但这取决于您的要求。
【讨论】:
【参考方案3】:试试这个:
$.ajax (
type: " POST" ,
url: url ,
crossDomain : true,
dataType : " json " ,
date : ' " strGroups ": " ISPB " ' ,
success : function ( data)
var content = JSON.parse ( data);
$.each(content, function(i, item)
console.log(i) ;
);
,
error: function (jqXHR, textStatus, errorThrown)
alert(" getDashBoard " + textStatus) ;
);
【讨论】:
以上是关于使用 jQuery ajax 调用 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
使用 POST 方法从 jQuery Ajax 调用 WCF 服务
我们可以在跨域中使用 Jquery $.ajax() 调用通过 https 访问 WCF 服务吗?
从 jQuery AJAX 调用 WCF 服务方法返回 404
从 jQuery 调用启用 AJAX 的 WCF 服务 - MVC 2