使用jQuery ajax调用WCF服务

时间:2014-05-20 10:03:01

标签: jquery ajax json wcf cross-domain

我使用声明如下的方法

创建了一个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的调用会返回此错误&#34; NetworkError:405方法不允许。锁定请求多原语(交叉源):原点的标准不允许读取远程资源http:// ....您可以通过在同一域上移动资源或激活CORS来解决问题。 &#34;

用调试器IE返回数据显示格式正确且对象&#34;内容&#34;拥有所有正确的价值;但循环不起作用:它返回&#34;字符无效&#34;

帮助meeeeee! 我绝望了:o

谢谢Cinzia

3 个答案:

答案 0 :(得分:0)

试试这个:

$.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) ;
}

});

答案 1 :(得分:0)

您必须在服务器站点上的WCF服务上激活CORS。 CORS用于获取same-origin-policyHere是一个很好的资源。

基本上你首先要添加一个消息检查器,然后你必须将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(如上所述),它应该适用于两种浏览器。

作为替代方案,您可以在同一个域上运行服务调用,但这取决于您的要求。

答案 2 :(得分:0)

非常感谢您的回答。 问题是即使我在相同的域上工作我也有同样的错误&#34; SCRIPT1014:无效的字符&#34;在

$.each(content, function(i, item) {
        console.log(i) ;
    });

如果我删除关于循环的行代码,IE会显示数据返回如下:

[{&#34; DESCR&#34;:&#34;雅卓&#34;&#34; percValore&#34;:0.003},{&#34; DESCR&#34;:&#34;雅卓2&#34;&#34; percValore&#34;:0.100}]

看来是对的! FireFox什么都不显示! 也许问题不是跨域而是响应? 谢谢Cinzia