所以,消息在整个WCF体系结构中处于一个核心的地位,WCF可以看成是一个消息处理的管道。 尽管消息在整个WCF体系中具有如此重要的意义,可是一般的WCF编程人员,却意识不到消息的存在。...第二,WCF是一个极具可扩展性的通信框架,可以灵活地创建一些自定义WCF扩展(WCF Extension)以实现你所需要的功能。...在执行该方法的时候,相应的序列化器会被调用,将对象序列化成XML并将其置于消息的主体部分。默认的序列化器就是我们在前面介绍的DataContractSerializer。...从最终产生的XML结构来看,消息的整个部分就是Order对象序列化后的XML。...(即上面演示过程中Order对象序列化的结果),文件名为E:\order.xml。
下的异常:FaultException 在《WCF技术剖析(卷1)》中,我曾经提到过,在整个WCF体系下,数据存在的形态大体可以分为两种:XML和托管对象(Managed Object)。...在WCF异常处理体系中,对于异常或者错误,在XML的世界里最终通过Fault消息体现;而在托管对象的世界中,即使相应的Exception对象。...在序列化FaultException对象生成Fault消息的时候,该对象最终会生成SOAP Fault的Code节点。...当WCF的服务端框架在进行错误提供过程中,将整个FaultException进行序列化并据此生成一个Fault消息,其Detail属性表示的错误明细对象被序列化后的XML作为SOAP...在服务执行过程中,我们手工抛出FaultException异常,WCF服务端框架会对该异常对象进行序列化病最终生成Fault消息。
接下来,将以这些问题为线索进行深入学习,包容包括XML序列化与SOAP消息、会话与实例、服务寄宿与客户端代理。 ?...可以这么说,整个WCF服务都是构建在SOAP消息的基础上的,而SOAP消息是建立在XML这种跨平台的数据格式的基础上的,有人可能会说WCF也支持Restful风格的服务并支持json格式的数据,的确是这样...说了这么多,目的只有一个就是学习WCF一定要意识到学习SOAP相关知识的重要性,因为整个WS-*网络服务标准协议簇都建立在其之上,而与SOAP的基础XML相关的知识也就同样凸显出来了,其中最重要的就是XML...在托管应用程序中,当创建一个托管对象时,CLR会在托管堆为该对象分配内存空间,对象的生命的终结对应内存的回收。...精简的WCF框架 服务端的流程包括:请求消息的接受和回复信息的发送;请求消息的解码和回复消息的编码;请求消息的反序列化和回复消息的序列化;服务对象的创建;服务操作的执行。
在服务执行过程中,我们手工抛出FaultException异常,WCF服务端框架会对该异常对象进行序列化病最终生成Fault消息。...下面的示例代码中,我们创建了一个MessageFault对象,分别针对SOAP 1.1和SOAP 1.2写到两个不同的XML文件中。...由于MessageFault定义与Fault消息中主体部分的Fault元素,即SOAP Fault,所以对于一个给定的表示Fault消息的Message对象,我们可以通过提取SOAP Fault对应,从而创建相应的...四、FaultException与MessageFault转换的核心:FaultFormatter 在《WCF技术剖析(卷1)》的第5章关于序列化和数据契约的介绍中,我们谈到:WCF借助于一个特殊的对象...在服务端对异常对象进行序列化并生成回复消息(Fault消息),在客户端对接收到的回复消息进行反序列化重建并抛出异常。
在真正通过WCF来架构我们的分布式系统中,我们往往需要一种折中的异常传播机制:自定义服务端异常信息。这样既可以让客户端得到一个易于理解的错误信息,又在一定程度上避免了一些敏感信息的泄露。...FaultException异常,该异常对象通过以字符串形式体现的自定义错误信息创建。...WCF通过两种典型序列化器实现对数据对象的序列化和反序列化,其中一个是传统的System.Xml.Serialization.XmlSerializer,该序列换器被ASP.NET Web服务用于对象和...XML之间的序列化和反序列化;另一个则是System.Runtime.Serialization.DataContractSerializer,用于基于数据契约对象的序列化和反序列化,后者是WCF默认采用的序列化器...DetailType:也就是上面所介绍的用于封装错误信息的错误明细类型,比如我们前面定义的CalculationError; Name和Namespace:在最终的Fault SOAP中,错误明细对象被序列化成的
在本篇文章中,我们将讨论WCF四大契约(服务契约、数据契约、消息契约和错误契约)之一的消息契约(Message Contract)。...在一些情况下,具有这样的要求:当序列化一个对象并生成消息的时候,希望将部分数据成员作为SOAP的报头,部分作为消息的主体。...后面的XML体现的是Customer对象在SOAP消息中的表现形式。...注:在《WCF技术剖析(卷1)》中的第六章有对SOAP 1.2的基本规范有一个大致的介绍,读者也可以直接访问W3C网站下载官方文档。...在WCF体系中,MessageFormatter负责序列化和反序列化任务(在《WCF技术剖析(卷1)》中的第5章对基于MessageFormatter的序列化机制有详细的介绍):ClientMessageFormatter
在客户端指定地址 2.4.3. 地址报头 2.3. 端口共享 2.3.1. 端口共享在WCF中的意义何在? 2.3.2. 基于HTTP|HTTPS的端口共享 2.3.3....WCF实现了CLR类型和XML的适配 4.2. 定义服务契约 4.3.1. ServiceContractAttribute 4.3.2....DataContractSerializer的序列化规则 5.3.2. 如何限定序列化对象的数量? 5.3.3. 如何保持对象现有的引用结构? 5.4. 已知类型 5.4.1....序列化在WCF框架中的实现 5.7.1. 消息格式化器 5.7.2. DataContractSerializer还是XmlSerializer? 5.7.3....实例演示:通过自定义消息格式化器压缩消息(S521) 第6章 消息 (Message) 6.1. SOAP与WS-Addressing 6.1.1. SOAP 6.1.2.
WCF是.Net框架中的技术,用来创建面向服务的应用程序,交换不同通信方案里的消息,以及执行服务操作生成的工作流。WCF应用程序由三部分组成 - WCF服务,WCF服务主机和WCF服务客户端。...在SOAP 的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。...由于WCF完全是由托管代码编写,因此开发WCF的应用程序与开发其它的.Net应用程序没有太大的区别,我们仍然可以像创建面向对象的应用程序那样,利用WCF来创建面向服务的应用程序。...序列化:WCF支持DataContract串行采用System.Runtime.Serialization,而Web服务通过使用System.Xml.Serialization支持XML序列化。...异常处理:在WCF中,未处理的异常都是在一个更好的方式通过使用FaultContract处理,并没有得到Web服务SOAP(简单对象访问协议)故障返回给客户端等。
构建一个简单的WCF应用 步骤一:构建整个解决方案 步骤二:创建服务契约 步骤三:创建服务 步骤四:通过自我寄宿的方式寄宿服务...5.1.2 持久化(Persisting)与序列化 5.1.3 数据结构与序列化 5.1.4 XML序列化器 5.2 数据契约与数据契约序列化器...WCF框架中的实现 5.6.1 MessageFormatter 5.6.2 MessageFormatter在WCF框架中的应用 第6章 ...和XmlDictionaryWriter 6.5 消息编码在WCF框架中的实现 6.5.1 消息编码器(MessageEncoder) ...中的应用 10.2.5 AOP在PetShop中的应用 10.2.6 MVP模式在PetShop中的应用
在这方面,XML无疑是最好的选择。所以WCF下的序列化(Serialization)解决的就是如何将数据从对象的表现形式转变成XML表现形式,以确保数据的正常交换。...DataContractSerializer序列化或者反序列化对象的数量;以及如何在序列化后的XML中保存被序列化对象的对象引用结构。...在这篇文章中,我们会详细讨论WCF序列化中一个重要的话题:已知类型(Known Type)。 WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML。...第二,WCF是一个极具可扩展性的通信框架,可以灵活地创建一些自定义WCF扩展(WCF Extension)以实现你所需要的功能。...在一些情况下,具有这样的要求:当序列化一个对象并生成消息的时候,希望将部分数据成员作为SOAP的报头,部分作为消息的主体。
在某些情况下(例如在使用WCF二进制XML格式时),序列化程序也支持XmlDictionaryReader和XmlDictionaryWriter类以使其能够生成优化的XML。...此参数确定序列化程序在单个ReadObject方法调用中序列化或反序列化的对象最大数目。(该方法总是读取一个跟对象,但此对象的数据成员可以具有其他对象。这些对象又可以具有其他对象,依次类推。)...注意,当序列化或反序列化数组时,每个数组项都计为一个单独的对象 5.往返行程 在一次操作中对对象进行反序列化和重新序列化时将发生往返行程。...创建遵循旧式SOAP编码标准的服务时。 在序列化数据协定类型时,DataContractSerializer类只序列化用DataMemberAttribute属性标记的成员。 ...表示业务对象的新自定义类型通常应作为数据协定类型创建。有关更多信息,请参见使用数据协定。 集合类型。这些是表示数据列表的类型。
该部分主要涉及WCF提供的异常处理模型和对WCF异常处理底层实现的分析,包括异常的序列化和反序列化、异常的传播、异常的屏蔽等。对于非分布式的单进程应用,异常处理无非就是简单的抛出异常和捕获异常而已。...默认情况下,如果异常在执行服务操作过程中抛出,其真正的异常细节信息仅限于服务端可见,在Debug阶段,可以通过如下设置发送详细异常信息。...在WCF中,所有的异常信息都是通过FaultException类来传播的,可以通过其泛型参数来传播自定义的信息。...在契约中,可以通过设置FaultContractAttribute中的相关属性来实现,属性包括:Action, DetailType, Name&Namespace, HasProtection&ProtectionLevel...和之前的章节提到Message用于传播SOAP消息之外,对于异常信息,WCF通过FaultMessage对象来传播,其对象包括如下属性:Code,表示错误代码;Reason,表示错误原因;Node,表示导致出错的
由于WCF完全是由托管代码编写,因此开发WCF的应用程序与开发其它的.Net应用程序没有太大的区别,我们仍然可以像创建面向对象的应用程序那样,利用WCF来创建面向服务的应用程序。 ...在SOAP的header中增加了WS-ReliableMessaging允许可信赖的端对端通信。...和Response, 当一个数据(XML格式的)被封装成SOAP格式的数据流发送到服务器端的时候,就会生成一个进程对象并且把接收到这个Request的SOAP包进行解析,然后对事物进行处理,处理结束以后再对这个计算结果进行...在涉及到不同信任域中多个 Web 服务的复杂情况下,还得建立自定义的特殊解决方案。...另外,客户端每次调用 ASP.NET Web 服务时,都创建一个新的对象以服务于该请求。方法调用完成后,该对象即被破坏。
服务端框架在初始化ServiceHost,并创建服务表述的时候(关于服务描述,以及在服务寄宿过程中对服务描述的创建,《WCF技术剖析(卷1)》的第7章有详细的介绍),会抛出如图1所示的InvalidOperationException...WCF通过一个重要的对象实现对托管对象的序列化和反序列化:序列化器(Serializer)。...关于这两种序列化器,在《WCF技术剖析(卷1)》第5章中已经有过深入的探讨,在这里就需要在画蛇添足了。...也就是说,基于在某个操作方法上应用了XmlSerializerFormatAttribute特性,WCF会采用XmlSerializer作为所有参数和返回值的序列化器,对于出现异常指定的错误明细对象,依然采用默认的...将会生成如下一个Fault SOAP,其中s:Body>// 节点中的XML为CalculationError对象序列化所的。
序列化和反序列化通过DispatchMessageFormatter完成 服务对象的创建:创建或者激活服务对象实例,InstanceProvider用于服务对象的创建或获取 服务操作的执行:调用创建的服务对象的操作方法...在本案例演示中,我们需要做的就是手工创建这些组件,并通过我们自己的代码利用它们搭建一个简易版的WCF框架。如果读者能够对本案例的实现有一个清晰的理解,相信对于整个WCF的框架就不会感到陌生了。...我们通过一个方法将服务端和客户端所需的所有组件都创建出来,为此,我们在Contracts项目中添加了一个Utility类型,在Create方法中创建所有的组件并通过输出参数的形式返回,泛型类型T表示的是服务契约类型...在OperationInvoker执行操作方法之前,通过反射的方式直接创建服务对象,这一步在真正的WCF框架中是通过InstanceProvider实现的。...回复消息通过IClientMessageFormatter进行反序列化后,在消息中以XML InfoSet实行体现的结果被转化成具体的对象,这些对象被最终影射为方法调用的返回值和输出参数(包含引用参数)
WCF的通信完全建立在消息交换上,而WCF支持多种不同类型的消息。消息的格式可以使基于XML的,也可以是非XML的(比如采用JSON格式的消息)。而我们使用的最多地XML消息类型是SOAP。...实际上WCF并没有定义继承AddressHeader的公有子类(AddressHeader所有具体的子类都是内部类型),我们只能通过定义在AddressHeader中的三个CreateHeader方法来创建...除了提供可序列化对象作为地址报头的内容之外,我们还可以调用第三个CreateAddressHeader方法重载直接指定一个字符串作为创建的地址报头的值。...针对可序列化对象创建的AddressHeader对象,其属性Name和Namespace返回的是对象序列化后生成的XML的根节点的名称和命名空间。...而客户端在通过指定EndpointAddress对象创建ChannelFactory或者ClientBase对象的时候,都可以为终结点地址指定相应的地址报头。
在请求和相应的DTO对象中添加字段,不会破坏旧的客户端。 在WCF中RPC和DTO风格的WebService均支持,但是在ServiceStack中仅支持DTO风格。...)以及WCF SOAP风格的WebService”。...中需要在实体类和字段上面添加DataContract和DataMember来表示序列化时需要的字段,如果没有添加这些标签,在序列化的时候就会忽略。...在ServiceStack中,方法和方法之间的区别是通过服务的参数及请求对象Request DTO来区分的,而不是像WCF中通过方法名称来区分。...Soap12ServiceClient 从名称可以看出,这几种不同之处在于支持的序列化和反序列化格式不同。
在以下情况下可能需要使用Message类: 需要一种替代方式来创建传出的消息内容(例如,从磁盘上的文件直接创建消息),而不是序列化.NET Framework对象。 ...需要一种替代方式来使用传入的消息内容(例如,需要将XSLT转换应用于原始XML内容),而不是反序列化为.NET Framework对象。 ...从对象创建消息 另一种重载采用一个附加的Object参数;此重载所创建的消息的正文是给定对象的序列化表示 public Message GetData() {...他们可以分为以下几类: 将整个消息正文一次性写出到XML编写器。这称为“写入消息”。 将XML读取器放在消息正文上。这使您可以在以后根根据需要逐段访问消息正文。这称为“读取消息”。...Version属性指示与消息相关联的SOAP和WS-Addressing版本;如果禁用了SOAP,则该属性为None. IsFault属性在消息为SOAP错误消息时返回true.
先来看4.0: public partial class TaskWebServiceClient : System.ServiceModel.ClientBase 代理类继承自WCF服务Client对象...,这个类是在.Net 3.0中引入WCF框架的时候添加进来的。...System.ServiceModel.ClientBase:提供用于创建可以调用服务的Windows通信基础(WCF)客户端对象的基本实现。...主要用于调用WCF创建的各种Binding类型的服务,当然也包括BasicHttpBinding也就是Soap 1.1。 接下来使用此代理类调用web服务。...经过监视soap消息,发现消息中其实已经返回了对象数据。怀疑是在soap消息反序列化成.net对象时候出了问题。可这个问题一直没找到原因。
在《通过一个模拟程序让你明白ASP.NET MVC是如何运行的》一文中我通过一个普通的ASP.NET Web程序模拟了ASP.NET MVC的执行流程,现在我们通过类似的原理创建一个用于模拟WCF服务端和客户端工作原理的模拟程序...[源代码从这里下载] 目录 一、基本的组件和执行流程 二、创建自定义HttpHandler实现对服务调用请求的处理 三、定义创建WCF组件的工厂...序列化和反序列化通过分发消息格式化器(DispatchMessageFormatter)完成; 服务对象的创建:创建或激活服务对象实例,实例提供者(InstanceProvider)用于服务对象的创建或获取...,在WCF中服务对象通过InstanceProvider创建 38: 39: object serviceInstance = Activator.CreateInstance...(Web应用地址+在Global.asax文件中添加的路由映射的地址)创建ServiceProxyFactory对象,并用它来创建用于尽心服务调用的代理对象即可。