使用 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

实现启用 AJAX 的 WCF 服务 - 来自 JQuery 的调用没有响应

通过 GET 方法调用 WCF jQuery AJAX 中的安全问题