我创建了一个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返回的数据显示格式正确且对象"content"具有所有正确的值;但是循环不起作用:它返回"字符无效"
救命!我绝望了:o
由于Cinziatry this:
$.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) ;
}
});
您必须在服务器站点上的WCF服务上激活CORS
。CORS用于绕过同源策略。这里有一个很好的资源。
基本上你必须首先添加一个消息检查器,然后你必须添加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的预飞行OPTIONS
调用(描述)。如果您在WCF-Service上启用CORS(如上所述),它应该在两个浏览器中都能工作。
作为一种选择,您可以在同一域中运行您的服务调用,但这取决于您的需求。
非常感谢您的回答。问题是,即使我在同一个域中工作,我也会在
上出现相同的错误"SCRIPT1014:无效字符"。$.each(content, function(i, item) {
console.log(i) ;
});
如果我删除了关于循环的行代码,IE会显示如下返回的数据:
[{"备注说明":"Altro"、"percValore":0.003},{"备注说明":"Altro 2","percValore":0.100}]
似乎是正确的!!FireFox什么都没显示!也许问题不在于跨域,而在于响应?谢谢你,Cinzia