昨天,博客园首页增加了Digg功能。在该功能中我们开始尝试使用jQuery直接调用WCF。之前我们采用的方案是jQuery调用Web Service,然后WebService再调用服务层。这样调用主要是因为之前需要调用不同域名下的WCF服务,因为跨域调用的问题,就要通过Web Service中转一下。而这次Digg功能调用的是同一个应用程序下的WCF,用jQuery直接调用WCF是更好的选择。在尝试这种方式的过程中遇到的一些问题和一些需要注意的地方需要记录一下,所以就写了这篇随笔。

  xland的jQuery调WCF给了我们很大帮助,在这里感谢xland!在探索技术的过程中,将自己解决问题的经验记录下来,不仅可以备忘、总结,而且可以帮助遇到同样问题的朋友,这也是写博客的一种乐趣吧。

  进入正题,jQuery调用WCF需要注意的一些问题:

  1. WCF的配置(WCF服务宿主于IIS 7)

  1)WCF服务相关配置:

  在需要调用的接口方法(OperationContract)上加上属性[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)],比如:

[ServiceContract] publicinterfaceIDiggService
    {      
        [OperationContract][WebInvoke(RequestFormat =WebMessageFormat.Json, ResponseFormat =WebMessageFormat.Json, BodyStyle =WebMessageBodyStyle.WrappedRequest)]stringGetDiggCountList(stringentryIdList);
    }

  给服务实现类加上属性:

[AspNetCompatibilityRequirements(RequirementsMode =AspNetCompatibilityRequirementsMode.Allowed)]publicclassDiggService : IDiggService
    {
     }

  否则调用时会出现错误:“IIS 7.0 Detailed Error - 500.0 - System.ServiceModel.ServiceActivationException”。
2) Web.config中的WCF相关配置:

<system.serviceModel><services><service name="DiggService"><endpoint address=""binding="webHttpBinding"contract="IDiggService"behaviorConfiguration="DiggServiceBehavior"/></service></services><behaviors><endpointBehaviors><behavior name="DiggServiceBehavior"><enableWebScript/></behavior></endpointBehaviors></behaviors></system.serviceModel>

  需要注意两个地方的配置:

  a)  binding="webHttpBinding",开始设置为binding="basicHttpBinding",出现错误提示:

The endpoint at 'DiggService.svc' does not have a Binding with the None MessageVersion.  'System.ServiceModel.Description.WebScriptEnablingBehavior' is only intended for use with WebHttpBinding or similar bindings.

b)  <enableWebScript/> ,启用这个设置才能让WCF支持Ajax调用,否则调用时WCF会返回这样的错误:

The message with To 'DiggService.svc/GetDiggCountList' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree.

  二、客户端jQuery调用注意

  开始按照调用Web Servcie的方式调用:

$.ajax({
        url: '/wcf/DiggService.svc/GetDiggCountList',
        data: '{"entryIdList":"'+entryIdList +'"}',
        type: 'post',
        dataType: 'json',contentType: 'application/json; charset=utf8',
        success: function(data) {if(data.d) {}
            }
        },
        error: function(xhr) {
            alert(xhr.responseText);
        }
    });  

  在FireFox中能成功调用,但在IE 8和Google Chrome中,调用后返回的却是IIS 7的错误信息:IIS 7.0 Detailed Error - 400.0 - Bad Request。

  后来将 contentType: 'application/json; charset=utf8' 改为 contentType: 'text/json'问题就解决了。

  jQuery调用Web Service与WCF还有一个不同之处在参数格式的处理上:

  比如上面代码中的data: '{"entryIdList":"' + entryIdList + '"}',如果将参数名的双引号去掉,即data: '{entryIdList:"' + entryIdList + '"}',可以正常调用Web Service,调用WCF会出现Json反序列化的异常。

  三、其他需要注意的地方

  如果WCF服务所在的IIS站点中绑定了多个域名, 在没有设置baseAddressPrefixFilters的情况下,会出现错误提示:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection.Parameter name: item

设置好baseAddressPrefixFilters,比如:

<serviceHostingEnvironment><baseAddressPrefixFilters><add prefix="http://www.cnblogs.com"/></baseAddressPrefixFilters></serviceHostingEnvironment>

这样在访问http://www.cnblogs.com时能正常调用,但访问http://cnblogs.com时调用就出错(IIS 7.0 Detailed Error - 404.0 - Not Found),因为之前的代码中使用的是相对地址调用,实际调用的是http://cnblogs.com/wcf/DiggService.svc/GetDiggCountList,由于设置了baseAddressPrefixFilters,不允许这样调用,只能改为绝对地址(http://www.cnblogs.com/wcf/DiggService.svc/GetDiggCountList),这样又会造成跨域调用。这个问题目前还不知如何解决。

  四、遗留问题

  如何控制缓存,比如:如何在WCF返回时设置Expires Header和If-Modified-Since,避免频繁的WCF调用。

  五、总结

  jQuery调用WCF的要点:

  1. [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]

  2. [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

  3.  binding="webHttpBinding"

  4. <enableWebScript/>

  5.  contentType: 'text/json'

(转 dudu)

jQuery调用WCF需要注意的一些问题相关推荐

  1. 用jquery调用wcf下的各种错误码的解释。

    连接出错了,很正常,http请求的xmlhttp异常在i不同的浏览器下是不一样的,下面是ie的报错代码 IE status Error codes: 1223 : Client canceled re ...

  2. Json 时间 转换为 Javascript 时间 Date Jquery 调用WCF

    "/Date(1232035200000)/" 怎么转换成 javascript 的 Date 对象 做法:new Date(+/\d+/.exec(value)[1]); val ...

  3. Jquery调用WCF经验分享

    博客园申请开通有一段时间了,一直没写博客,真对不起博客园,郁闷费话少说,今天有时间,来总结一下最近项目中用的一些知识知,主要是Jquery调用WCF服务.本文讨论一下Jquery异步调用WCF服务的过 ...

  4. jQuery调用WCF服务传递JSON对象

    下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...

  5. jquery调用WCF

    1.添加新项:启用了Ajax的WCF. 2.[ServiceContract(Namespace = "")]     [AspNetCompatibilityRequiremen ...

  6. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  7. 学习 WCF (6)--学习调用WCF服务的各种方法

    根据不同的情况,我们可以用不同的方法调用WCF服务,本文简单总结了一下调用WCF的一些方法(代理类,Ajax...),分享给大家.开发工具调用WCF 这中方法很方便也很简单,很多工作VS就帮我们完成了 ...

  8. 实现jquery.ajax及原生的XMLHttpRequest调用WCF服务的方法

    废话不多说,直接讲解实现步骤 一.首先我们需定义支持WEB HTTP方法调用的WCF服务契约及实现服务契约类(重点关注各attribute),代码如下: //IAddService.cs namesp ...

  9. jquery跨域调用wcf

    使用jquery跨域调用wcf服务的时候会报如下错误 1 $.ajax({ 2 url: 'http://localhost:28207/Service1.svc/GetData', 3 method ...

最新文章

  1. 使用Powershell如何导出Exchange对象中的多值属性值
  2. AngularJS学习日记(四)Service和Provider
  3. 左神算法:将搜索二叉树转换成双向链表(Java版)
  4. 分享:wkhtmltoimage开源工具的基本应用
  5. python安装虚拟环境出现错误_virtualenv 安装虚拟环境问题 请大神指点一二
  6. 手机uc浏览器夜间模式怎么设置调成全黑
  7. LwIP之套接字接口
  8. vue 获取响应头里set-cookie的值_最简化 VUE的响应式原理
  9. 35岁学嵌入式合适吗_保姆级攻略来了!嵌入式冰箱该怎么选?看这篇就够了
  10. 在线等比数列项数生成器
  11. java知识总结-24
  12. UVA 10651 - Pebble Solitaire
  13. paip.url参数格式化.txt
  14. 金属表面PCB板电池电容电镀废水铜镍回收和去除工艺
  15. 科技T3国产平台!成功搭载“翼辉国产实时系统SylixOS”
  16. 秒杀于丹、蒋勋、蒙曼,每篇都有10万+的潜质。《六神磊磊读唐诗》,5星。
  17. 悉尼大学计算机录取要求,悉尼大学录取要求
  18. gitlab权限分配
  19. 网线插座接法,网线模块制作及其安装步骤(图解)
  20. 城市大脑从起源到终极状态的7个阶段

热门文章

  1. C++STL的vector容器
  2. 13.5.虚拟化工具--jhat详解、13.6.虚拟化工具--jstack详解
  3. Gulp构建前端自动化工作流
  4. Oracle_Net_Configuration_Assistant_配置步骤
  5. Java代码书写规范
  6. Android-使用嵌入式SQLite
  7. 窗口分析函数_18_算累计百分位数
  8. 检索数据_11_限制返回的行数
  9. odps结合mysql统计
  10. oracle 压测工具 ld,Oracle压力测试工具使用说明