WCF 学习总结6 -- WCF参数与返回值

原创 2011年01月19日 01:33:00

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序列化的工具来完成:DataContractSerializerXmlSerializer。
那么,WCF支持哪些类型的参数和返回值呢?当然WCF里推荐使用[DataContract]和[DataMember]来定义复杂的自定义对象,但是在WebService时代里,我们知道只要实体类或者其父类被标识为[Serializable]就支持序列化了,就可以作为WebMethod的参数或者返回值了。在有些场景,已经生成好众多实体类,又不想一个个为每个属性加上[DataMember],自然很怀念[Serializable]。OK,下面来看看代码:

1. 服务契约:

2. 服务实现:

3. 客户端:

4. 运行:
wcf_serializable_1
运行结果说明:WCF除了支持默认的[DataContract]对象以外,还支持[Serializble]对象,DataTable也是被支持的。
但是用DataTable作为参数或者返回值时,DataTable的TableName一定不能为空。否则会抛出下面的错误:
The underlying connection was closed: The connection was closed unexpectedly.
光看这个异常,还真不知道哪不对了。。。就算你没有调用带DataTable的方法,也不行。很诡异的错误提示。。。

另外,大家注意到这个细节了没有。服务端定义的对象,在客户端生成的代理却是这样的?
 wcf_svc_class

所有字段都加上了 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开发,有个需求是在服务端做认证,网上查资料了解到可以用UserName和Password 来做认证,只需要写好配置文件和在服务端写好验证类就行了,但是网上普遍的博文都是需要用证书,而我自...

WCF-WCF中传输泛型List 对象(转)

摘自:http://www.cnblogs.com/homezzm/archive/2009/12/01/1614467.html   在编程时,DataSet、DataTable,以及 List...
  • windxxf
  • windxxf
  • 2012年05月25日 10:46
  • 3301

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

WCF 返回对象

 using System; using System.Collections.Generic; using System.Linq; using System.Web; using S...

解决WCF接口无法传递object参数的问题

  在某些场合中,我们需要提供以object为参数的方法。不过在WCF中,由于需要序列化与反序列化,因此它要求所有WCF传递的参数类型都是已知的,无法传递object这种未知类型。即使用了KnownT...
  • ggw128
  • ggw128
  • 2011年05月26日 20:40
  • 6966

在WCF中能返回的类型

Windows Communication Foundation (WCF) 使用 DataContractSerializer 作为其默认的序列化引擎以将数据转换到 XML 并将 XML 转换回...

WCF返回表datatable时的解决

在WCF中有时返回值类型是一张表,就会遇到反序列化的问题。解决该问题我归纳了两种方法: 1、根据Model层的类,在服务器端将Table转化成List,在客户端再将List转化为table   /...

第十三章以更好的性能实现WCF服务(上)

前言 良好的性能是大多数应用程序和服务的关键因素,你可以通过周密地设计,以及选择合适的特性以确保WCF服务维持其吞吐量,保持响应并具有可扩展性。到目前为止,这些技术包括事务(上,下),sessi...

WCF 上传大数据时 报错 读取 XML 数据时,超出最大数组长度配额(16384)

WCF 上传大数据时 报错 读取 XML 数据时,超出最大数组长度配额(16384) 修改服务端配置 服务器端没有 bindings 节点需要在system.serviceModel中增加 ...

Rest 服务Get和Post的参数传值

 1. get是从服务器上获取数据,post是向服务器传送数据。 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。po...
  • XMM_1030
  • XMM_1030
  • 2014年02月11日 10:34
  • 21014
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WCF 学习总结6 -- WCF参数与返回值
举报原因:
原因补充:

(最多只允许输入30个字)