jQuery调用WCF需要注意的一些问题
昨天,博客园首页增加了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]
public interface IDiggService
{
[OperationContract]
[WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string GetDiggCountList(string entryIdList);
}
给服务实现类加上属性:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class DiggService : 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. c) 当出现 如下错误
使用“UriTemplate”的终结点无法用于“System.ServiceModel.Description.WebScriptEnablingBehavior”。
把 <enableWebScript/>换成<webHttp/>,解决!
二、客户端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'
参考文章:
1. jQuery调WCF
相关小组: http://space.cnblogs.com/group/100319/
转自:http://www.cnblogs.com/dudu/archive/2009/07/14/1523082.html
参考:http://www.cnblogs.com/yjmyzz/archive/2009/11/04/1595783.html
jQuery调用WCF需要注意的一些问题的更多相关文章
- VS2010中使用Jquery调用Wcf服务读取数据库记录
VS2010中使用Jquery调用Wcf服务读取数据库记录 开发环境:Window Servere 2008 +SQL SERVE 2008 R2+ IIS7 +VS2010+Jquery1.3.2 ...
- 抛弃WebService,在.NET4中用 jQuery 调用 WCF
在我们之前的开发中,对于ajax程序,都是通过jQuery调用标记为[System.Web.Script.Services.ScriptService]的WebService,然后在WebServic ...
- JQuery调用WCF服务,部署在iis
Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...
- jQuery调用WCF
jQuery要调用WCF,首先要创建service.svc服务文件,这里边需要注意: [ServiceContract(Namespace = "")] [AspNetCompat ...
- jquery调用wcf案例
----------根据其他网友总结 1.在契约接口上添加:[WebInvoke(RequestFormat=WebMessageFormat.Json,ResponseFormat=WebMessa ...
- jQuery调用WCF服务传递JSON对象
下面这个示例使用了WCF去创建一个服务端口从而能够被ASP.Net页面通过jQuery的AJAX方法访问,我们将在客户端使用Ajax技术来 与WCF服务进行通信.这里我们仅使用jQuery去连接Web ...
- JQuery调用WCF服务
一:创建一个wcf服务项目 [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(RequestF ...
- jQuery调用WCF 说明
在项目中用过一些WCF的技术这篇文章是对以前用过的一点东西的一个梳理 一,webconfig的配置除了一般的配置外,与WCF相关的配置如下 <system.serviceModel> ...
- jquery 调用wcf 的SOA架构,将三层架构运用到SOA的架构中来(第四天)
经过前面3天的学习,我想大家应该对SOA的架构有了初步的了解,其实 SOA与三层架构并不冲突,而是三层架构的升级版. 来看下传统的三层架构! 一共可以分为4个层: 模型层(可有可无),客户端,服务端, ...
随机推荐
- 快递鸟电子面单打印功能基于java
之前的后天管理系统的电子面单打印使用的是灵通打单. 使用相对比较麻烦,需要到处Excel之后再导入,麻烦. 快递鸟有电子面单api,后台系统直接对接很是方便,不过也遇到了好些问题. 不难是不难,但是遇 ...
- 一台电脑如何安装多个版本的JDK
1 . 准备两个版本的jdk我的两个jdk路径为: C:\Program Files\Java\jdk1.6.0_43 C:\Program Files\Java\jdk1.8.0_25 2 . ...
- Centos7 如何减少/home分区,扩大/root分区
把/home内容备份,然后将/home文件系统所在的逻辑卷删除,扩大/root文件系统,新建/home:tar cvf /tmp/home.tar /home #备份/home umount /hom ...
- 机器学习之路:python 集成回归模型 随机森林回归RandomForestRegressor 极端随机森林回归ExtraTreesRegressor GradientBoostingRegressor回归 预测波士顿房价
python3 学习机器学习api 使用了三种集成回归模型 git: https://github.com/linyi0604/MachineLearning 代码: from sklearn.dat ...
- 【HackerRank Week of Code 31】Colliding Circles
https://www.hackerrank.com/contests/w31/challenges/colliding-circles/problem 设E(n)为序列长度为n时的期望值. \[ \ ...
- Codeforces Round #354 (Div. 2) E. The Last Fight Between Human and AI 数学
E. The Last Fight Between Human and AI 题目连接: http://codeforces.com/contest/676/problem/E Description ...
- PAT甲级1127. ZigZagging on a Tree
PAT甲级1127. ZigZagging on a Tree 题意: 假设二叉树中的所有键都是不同的正整数.一个唯一的二叉树可以通过给定的一对后序和顺序遍历序列来确定.这是一个简单的标准程序,可以按 ...
- ASP.NET Web API 记录请求响应数据到日志的一个方法
原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/ ASP.NET Web API 记录请求响应数据到日志的一个 ...
- ssh连接时提示THE AUTHENTICITY OF HOST XX CAN'T BE ESTABLISHED
问题描述:使用ssh远程连接的时候报如下错误: 解决办法: 输入如下命令: ssh -o StrictHostKeyChecking=no root@123.59.xx.xx 输入密码,链接成功 其他 ...
- git push时提示"Everything up-to-date"
从github上git clone下的项目,添加或修改文件后,git push时出现"Everything up-to-date" , 即“一切都是最新的'. 通过 git s ...