Message是WCF信道层提供的一个类,在Message类里,数据被标识成一个XML Information Set, 简称为InfoSet。当数据从客户端传输给服务端时,binding里指定的消息编码协议将决定包含客户端所提供数据的Message对象将以何种形式提供给服务(服务端到客户端也一样)。然而,所有标准的binding都会使用将Message对象表示成XML InfoSet的编码协议。根据预定义binding的编码协议,XML InfoSet可能会使用各种标准的XML文本编码、MTOM或者二进制格式。也就是说从WCF应用层到传输将会是下面这个过程:
[序列化]>(XML InfoSet)>编码(Text/MTOM/Binary)>传输>解码>(XML InfoSet)>[反序列化]
WCF提供了两种XML序列化的工具来完成:DataContractSerializer和XmlSerializer。
那么,WCF支持哪些类型的参数和返回值呢?当然WCF里推荐使用[DataContract]和[DataMember]来定义复杂的自定义对象,但是在WebService时代里,我们知道只要实体类或者其父类被标识为[Serializable]就支持序列化了,就可以作为WebMethod的参数或者返回值了。在有些场景,已经生成好众多实体类,又不想一个个为每个属性加上[DataMember],自然很怀念[Serializable]。OK,下面来看看代码:
1. 服务契约:
2. 服务实现:
3. 客户端:
4. 运行:
运行结果说明:WCF除了支持默认的[DataContract]对象以外,还支持[Serializble]对象,DataTable也是被支持的。
但是用DataTable作为参数或者返回值时,DataTable的TableName一定不能为空。否则会抛出下面的错误:
The underlying connection was closed: The connection was closed unexpectedly.
光看这个异常,还真不知道哪不对了。。。就算你没有调用带DataTable的方法,也不行。很诡异的错误提示。。。
另外,大家注意到这个细节了没有。服务端定义的对象,在客户端生成的代理却是这样的?
所有字段都加上了 k__BackingField,原因是默认的DataContractSerializer序列化搞的鬼~
[DataContract]的Response Message XML InfoSet
[Serializable]的Response Message XML InfoSet,真是面目全非了。
原因应该是DataContractSerializer(System.Runtime.Serialization命名空间下)是在实际访问方法时,对参数列表的对象进行序列化。标识为[DataMember]特性的[DataContract]能够别识别并正常的序列化,而[Serializable]对象只能通过反射,而被反射出来的Public Field被加进去了不想要的东西。。。
解决办法也简单:就是改用XmlSerializer代替DataContractSerializer。只要在服务契约上声明一下:
[XmlSerializerFormat]特性就可以了。
[ServiceContract]
[XmlSerializerFormat]
public interface IService1
{
[OperationContract]
List<CustomerObjectOfDataContract> GetDataFromListOfDataContract();
[OperationContract]
List<CustomerObjectOfSerializable> GetDataFromListOfSerializable();
[OperationContract]
DataTable GetDataFromDataTable();
}
使用[XmlSerializerFormat]后,[Serializable]的Response Message XML InfoSet:
源码下载
本系列链接:
WCF 学习总结1 -- 简单实例
WCF 学习总结2 -- 配置WCF
WCF 学习总结3 -- 实例模式
WCF 学习总结4 -- 用Duplex实现消息广播
WCF 学习总结5 -- 消息拦截实现用户名验证
WCF 学习总结6 -- WCF参数与返回值
WCF 学习总结7 -- 流模式实现文件上传
WCF 学习总结8 –- WCF 事务处理
分享到:
相关推荐
WCF 实例源代码------聊天室 WCF 实例源代码------聊天室
WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--WCF简单实例--
WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2WCF服务编程10-2
WCF参数与返回值测试的示例代码:原文见 http://blog.csdn.net/fangxinggood/archive/2011/01/19/6151418.aspx
WCF服务编程04-05WCF服务编程04-05WCF服务编程04-05WCF服务编程04-05
wcf开发:WCF培训上课实例-带有宿主的WCF程序。WCF培训上课实例-带有宿主的WCF程序WCF培训上课实例-带有宿主的WCF程序WCF培训上课实例-带有宿主的WCF程序
11.再谈WCF的双向通讯-基于Http的双向通讯 V.S. 基于TCP的双向通讯
《WCF 证书移除工具 - WCFMultiCersRemover》 blog文章源码 WCFMultiCersRemover 提供的功能 对X509证书,CurrentUser/LocalMachine存储区 1、移除WCF所有证书 2、移除所有同名证书 3、移除指定证书名的所有证书...
wcf实例化-单调服务模式,言简意赅,很容易理解。就是现在积分没发控制,不然1分即可。很简单的代码
这是一个Ext框架,我对此框架很感兴趣。。。特别想了解一下。。。
学习.net wcf 入门版 pdf english
WCF 学习总结4 -- 用Duplex实现消息广播 详细参看:http://blog.csdn.net/fangxinggood/archive/2011/01/15/6142861.aspx#1667031
微软MSDN的WCF实验室手册 是WCF初学者的入门法宝
WCF 学习总结7 -- 流模式(Streaming)实现文件上传 http://blog.csdn.net/fangxinggood/article/details/6164017
WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2WCF服务学习1,2
WCF学习笔记, 一步一步教你学习WCF
WCF 项目应用连载[6] - 升级Lig服务 - 设计ILigger 构建一个完善的Lig版本 WCF 项目应用连载[7] - 绑定、服务、行为 大数据传输与限流 - 上 WCF 项目应用连载[8] - 绑定、服务、行为 大数据传输与限流 - 下 ...
WCF代码1-简单的WCF程序WCF代码1-简单的WCF程序
WCF学习总结 ppt,包含wcf的体系结构图,创建过程图解,适合wcf初学者。 构建分布式应用程序的技术有:.Net Remoting,Web service,Web service enhancement,MSMQ... WCF(windows communication Fundation)是比以上...
WCF 项目应用连载[6] - 升级Lig服务 - 设计ILigger 构建一个完善的Lig版本 C#源码 ---------------------------------------- WCF 项目应用连载[1] - 索引 - 轻量级的Log系统 - Lig Sample -序 WCF 项目应用连载[2]...