代码改变世界

随笔档案-2011年6月23日

WCF 第二章 契约 系列文章

2011-06-23 22:29 by DanielWise, 3827 阅读, 收藏, 编辑
摘要: 上一个系列向大家普及了什么是WCF? WCF 由什么组成? WCF 主要通过什么方式寄宿等等。给大家提纲挈领般的提出了一个总的概括,就相当于这个社会主体已经存在,我们下一步将要描述社会具体由什么组成的,各个组成部分都发挥着什么样的作用,社会中最核心、最基础的内容是什么? 不用我回答,我们也能亲身体验到,社会存在的核心就是诚信,进一步讲构筑诚信的基础是什么呢? 契约,既构筑了真实世界的基础,也构筑了WCF的基础。我们在这一章会详细讨论这个基础与核心。[第1篇] 基础在原子和金钱世界中,契约是两个或多个组织以一个已知的价格提供商品和服务的合同。在比特和服务的世界中,契约有类似的功能:它是两个或多个 阅读全文

WCF 第二章 契约 总结

2011-06-23 22:04 by DanielWise, 746 阅读, 收藏, 编辑
摘要: 这一章覆盖了非常多的契约背景,它们是互通性的基础。契约精确地描述了一个服务所能理解的消息。 WCF高度利用SOAP于契约定义中。特别的,它使用WSDL来描述服务终结点,使用XSD来描述数据。定义在WSDL中的服务操作用来在运行时把收到的请求转发给正确的.NET类。类似的,通过XSD契约定义的XML文件在运行时被反序列化成.NET类型而且发送给服务操作。合二为一,WSDL和XSD定义提供了对服务实现... 阅读全文

WCF 第二章 契约 消息契约

2011-06-23 21:59 by DanielWise, 2584 阅读, 收藏, 编辑
摘要: 消息契约描述了发送给一个服务以及从一个服务接收的SOAP消息的结构,并且允许你检测和控制SOAP消息头和消息体中大部分细节。而且数据契约能够让使用XML元数据定义(XSD)标准的系统之间互通,消息契约能够让任何通过SOAP通信的系统互通。 使用消息契约能够通过直接访问SOAP消息头和消息体提供对发送给一个服务以及从一个服务接收的SOAP消息的完全控制。这允许使用简单或复杂的类型来定义SOAP部分的精确内容。就好比当你需要对数据序列化的完全控制时你可以从DataContractSerializer转换到XmlSerializer,当你需要对SOAP消息完全控制时你可以从DataContracts 阅读全文

WCF 第二章 契约 数据契约等效

2011-06-23 21:53 by DanielWise, 768 阅读, 收藏, 编辑
摘要: 如果你在使用WCF暴露服务而且使用svcutil.exe来为创建访问服务代码,一般情况下你不需要关心在客户端和服务端间传输的消息的线上表示。数据契约知道WCF把一个.NET类型序列化成一个XML信息集和讲一个XML信息集反序列化成一个.NET类型。XML信息集可能在线上以文件或者二进制形式编码,这些取决于通信过程中所使用的绑定,但是再次,.NET代码不会意识到编码的存在。这种方式就好比你在代码中使用.NET类型但是一个基于标准的XML信息集的编码表示在线上具体传输。 然而有很多种情况你需要在客户端和服务端使用不同的类型。如果客户端和服务端是不同组织开发的那么这很有可能,或者仅仅单边的通信是使用 阅读全文

WCF 第二章 契约 数据契约版本

2011-06-23 21:51 by DanielWise, 909 阅读, 收藏, 编辑
摘要: 变化是不可避免的。企业改变,技术改变,法律改变,软件契约也会改变。在面对软件的变更时,一个坚实的版本控制是必须的。我们必须为不可避免的变化做好提前准备同时对已经存在的客户端进行向后兼容处理。 对数据契约版本控制来说,最常见的需求是向已有的数据契约中添加成员。通过这一部分的描述,你可以做任何改动而不会破坏现有客户端。但是如果你需要打破现有客户端的向后兼容性,你必须通过改变数据契约的名字或者命名空间来定义另一个版本的数据契约。 一个小的注意是要注意不间断的变化。不间断,从WCF的标准来看,可能会打破与其他系统的兼容性。例如,如果与一个要求元数据验证的系统通信,系统可能会拒绝消息如果接收到的XML实 阅读全文

WCF 第二章 契约 在WSDL中使用KnownType暴露额外类型

2011-06-23 21:44 by DanielWise, 2648 阅读, 收藏, 编辑
摘要: 如果数据类型满足任何先前描述的条件,那么它们会在WSDL中暴露出来。有一些额外的可能,当然,你也可能想强制一个类型包含在WSDL契约中。 举一个类继承的例子。如果一个序列化的派生类到达一个期待得到一个序列化的基类的终结点时,WCF不会知道如何反序列化这个派生类因为它不是契约的一部分。另外一个例子是一个hashtable 类,存储了其他的类作为自己的元素。WSDl将会定义hashtable类,但是不是那么存储在hashtable内部的类。 在这些情况下,你必须告诉WCF这些应该显示包含在WSDL契约中的类。这是使用KnownTypes完成的。它可以在四种方式下完成:通过添加一个KnownType 阅读全文

WCF 第二章 契约 定义类的层次结构

2011-06-23 21:36 by DanielWise, 1177 阅读, 收藏, 编辑
摘要: 复杂类型一般在代码中以类的形式实现。复杂类更进一步通过增加特殊结构的继承关系来定义。这种方式,一个通用类型比如”price” 可以派生出为一个更加特殊的类型如”stock price” 或者 “house price”.WCF支持通过在WSDL中合适的表示的类的继承关系,在类结构和XML之间序列化和反序列化它们同时从每个类中取出属性并加入到一个集合中。 在列表2.17中,类Price由三个元素和一个子类组成。StockPrice,继承自Price.命名空间应用到两个类上所以它们在XML中由完全合法的名字。每个元素保留自己的命名空间。 列表2.17 使用数据契约定义类的层次结构 using Sy 阅读全文

WCF 第二章 契约 数据契约

2011-06-23 21:31 by DanielWise, 5358 阅读, 收藏, 编辑
摘要: 在一个服务内部,功能性的应用由代码实现的。在服务外部, 功能性服务在WSDL中定义。在一个WCF服务中,应用程序数据在简单和复杂类型表示;而在服务外部,应用程序数据由XML元数据定义表示。WCF数据契约提供了对代码定义的.NET CLR类型与W3C组织定义用来在服务外部通信的XML元数据定义之间的映射。使用WCF,开发人员花费更多的时间在代码和接口语义上,在XSD和WSDL语法上花费的时间会更少。那不是说XSD和WSDL语法不重要;它们是跨平台系统上进行互操作必要前提。但是编译器也显示出了在把由.NET 语言生成的数据结构翻译为跨平台的具有互操作性的XSD和WSDL表示的优势。在设计阶段,[D 阅读全文

WCF 第二章 契约 WSDL中的操作名字、类型、操作和命名空间

2011-06-23 21:23 by DanielWise, 4393 阅读, 收藏, 编辑
摘要: WCF 根据服务端源代码中定义的内部类名称和属性来生成外部暴露服务实现。这些实现通过服务中的MEX终结点暴露出来并在设计阶段时被客户端以WSDL形式使用。接下来在客户端,WSDL会被用来写一些代码来建立可以与服务端通信的适当的消息格式。所以你选择的类,方法和参数的名字与服务范围潜在相差很远。然而,在服务的接口暴露内部名字和外部细节是很不好的形式。比如,你可能有一个叫BurgerMaster的分配算法,你想在外部以Resources名字暴露这个算法。或者可能有内部的编码标准要求你应该命名接口。幸运的是,你可以通过修改[ServiceContract],[OperationContract], [ 阅读全文

WCF 第二章 契约 在一个服务中实现多个契约和终结点

2011-06-23 21:16 by DanielWise, 5109 阅读, 收藏, 编辑
摘要: 一个服务作为一系列终结点被定义的。每个终结点都有一个地址,绑定和契约。契约就是暴露终结点能力的。地址就是这些应用或服务从网络的哪个地址可找到,契约是关于如何访问他们的。在终结点和契约间有一对多的关系。一个终结点可以只有一个契约,但是一个契约可以被很多终结点引用。尽管一个终结点可以仅仅确认一个契约,接口聚合使能一个单独的契约来暴露多个接口。另外,多个有同样绑定但是不同契约的终结点可以位于同一个地址,给一个单独终结点实现所有契约的假象。通过在一个服务中的多个终结点暴露一个契约,你可以让服务在不同绑定下都可以访问。你可以定义一个终结点使用WS-I基础协议绑定来得到最大访问量同时使用另外一个使用TCP 阅读全文

WCF 第二章 契约 实现一个双向契约的客户端部分

2011-06-23 21:11 by DanielWise, 997 阅读, 收藏, 编辑
摘要: 为了参与到一个双工消息交换模式中,客户端必须实现WCF的ABCs-必须在客户端定义服务要把消息发送到的地址,指导服务端如何把消息发送给客户端的绑定,定义消息内容和格式的契约。幸运的是,当你生成一个客户端代理而且在运行时使用信道结构时,WCF很大程度上考虑到了这些。生成一个客户端代理类,你可以使用svcutil.exe或者添加服务引用。代理定义一个与服务同名的接口,并在后面加上Callback.如果服务契约接口是IStockService,客户端接口就是IStockServiceCallback。客户端必须实现一个从接口继承的类。在运行时,与服务类似,客户端通过终结点定义和发送消息给客户端来严格 阅读全文

WCF 第二章 契约 实现一个双向契约的服务端部分

2011-06-23 21:07 by DanielWise, 1099 阅读, 收藏, 编辑
摘要: 一个双向契约包含服务终结点和客户端终结点的接口实现。在契约类型中,服务端契约在客户端实现。 列表2.6为一个提供stock price更新的服务定义一个服务契约。它使用双工通信以便于一个客户端可以注册更新,服务将周期性的发送更新消息给客户端。客户端通过调用服务端的RegisterForUpdates操作来初始化通信。服务然后会创建一个线程来周期性的通过调用客户端的PriceUpdate操作来发送... 阅读全文

WCF 第二章 契约 两个单向契约VS一个双向契约

2011-06-23 21:05 by DanielWise, 1159 阅读, 收藏, 编辑
摘要: 你可以通过两个不同消息交换模式来解决双向通信问题。你可以使用两个单向契约,或者你可以使用一个双工契约。对于两个单向契约来说,客户端和服务端都是独立的WCF宿主。它们分别暴露终结点来可以让另一个向自己发消息。因为它们是全面的服务,它们可以暴露多个终结点,使用多个绑定和独立的定义契约的版本。使用一个双工契约,客户端不用明确的变成一个WCF服务而且不用很复杂(很灵活)来选择绑定或者暴露其他终结点。更进一... 阅读全文

WCF 第二章 契约 双向操作

2011-06-23 21:03 by DanielWise, 1197 阅读, 收藏, 编辑
摘要: 请求-回复通信是客户端与服务端最普遍的消息交换模式。通信在客户端被初始化,客户端发送一个请求消息给服务端,然后服务端发送一个返回消息给客户端。如果返回消息很快,那么通信过程可以是同步的,所以客户端应用程序阻塞等待反馈。如果请求和回复之间会有延时,请求-回复模式可以在客户端使用标准.NET技术实现异步调用。在那种情况下,WCF会在发送请求给服务端后立即把控制返回给客户端应用程序。当服务接收到反馈以... 阅读全文

WCF 第二章 契约 单向操作

2011-06-23 21:01 by DanielWise, 1091 阅读, 收藏, 编辑
摘要: 当一个客户端需要向一个服务端发送消息但是不接受返回消息时,但不消息交换模式很有用。使用这个模式,客户端只需要消息成功传递的确认;它不需要服务端返回一个精确的消息。有时单步模式被错误的称作"发后不理"。在实际应用中,它是"发送和理解"因为调用者接收到一个消息成功提交到通信信道的确认。 WCF支持在服务操作层次的单向消息交换模式。服务操作可以被标记为单向而且基础结构将会使那种情况更完善。当一个客户端调用服务端的一个单项方法时,或者更准确的说,当一个客户端发送一条消息给一个操作被标记为单向的服务终结点时,控制端在服务操作完成之前就返回给调用方。单向操作通过在属 阅读全文

WCF 第二章 契约 异步访问服务操作

2011-06-23 20:58 by DanielWise, 1478 阅读, 收藏, 编辑
摘要: 好的设计会降低用户必须等待一个任务结束然后初始化另一个任务之前的情况。例如,当一个e-mail客户端正在下载新邮件,你仍然可以读或者删除已经下载下来的邮件。或者当一个浏览器正在下载一个网页上引用的图片时,你仍然可以拖动网页或者跳转到任何地方。在客户端程序中的多任务形式是通过异步设计模式来完成的。在WCF中,请求-回复服务操作导致当服务操作在执行时客户端被阻塞。更深一层,由svcutil.exe生成的代理代码使用阻塞来调用服务通信信道栈。这使得客户端应用程序在服务调用过程中被阻塞。如果服务需要十分钟完成,客户端引用程序将会在整个调用过程中冻结来等待回复。幸运的是,你可以在.NET Framewo 阅读全文

WCF 第二章 契约 同步请求回复操作

2011-06-23 20:51 by DanielWise, 1396 阅读, 收藏, 编辑
摘要: 对服务操作来说,同步请求回复消息交换是最普通的模式。这个模式就像任何人在面向过程或者面向对象语言中编程的那样。请求回复模式是本地过程调用的原型,对远程过程调用也很普通。图片2.3显示了一个请求回复交互,一个在客户端运行的代理发送请求给一个服务,服务端同步返回消息给客户端。WCF使得在客户端和服务端进行请求-回复通信非常容易。在设计阶段,你使用添加服务引用或者svcutil.exe来调用服务元数据终结点而且生成一个客户端代理来模仿服务操作的签名。这允许客户端代码像本地函数调用一样调用代理上的方法。代理把方法名字和参数序列化成一个SOAP消息,然后发送SOAP消息到服务端,然后创建一个.NET类型 阅读全文

WCF 第二章 契约 服务契约

2011-06-23 20:48 by DanielWise, 1549 阅读, 收藏, 编辑
摘要: 服务契约描述了由服务终结点实现的接口操作。服务契约引用消息格式并描述它们是怎么被交换的。消息格式更进一步被数据契约和消息契约描述。这一部分主要涉及由服务契约实现的消息交换。 WCF在设计时和运行时使用服务契约。在设计阶段,它们确定应该在WSDL理暴露为终结点的代码的类。一个使用[ServiceContract]标记的类和使用[OperationContract]标记的类中方法在WSDL中暴露以便于它们可以被客户端访问。类以wsdl:service确定,操作以wsdl:operation确定。在运行时,当WCF分开器接收到消息时,它查看wsdl:operation 的名字来确定类中的以[Oper 阅读全文

WCF 第二章 契约

2011-06-23 20:44 by DanielWise, 1417 阅读, 收藏, 编辑
摘要: 在原子和金钱世界中,契约是两个或多个组织以一个已知的价格提供商品和服务的合同。在比特和服务的世界中,契约有类似的功能:它是两个或多个组织之间确定消息交换和消息条款及条件的合同。 契约是由服务终结点发送或接收的消息的描述。每一个终结点都由ABCs定义:一个消息发送到的网络上的地址,一个描述消息如何发送的绑定,一个描述消息格式的契约。 记住服务实际上是终结点集合,终结点用代码实现了特殊算法。它们可以实现高级别的商业功能,比如进入一个订单履行系统,或者可以更细粒度,比如寻找客户的地址。高级功能一般需要复杂的数据结构,而针对性的功能通常需要更多基本数据类型。在任何一种情况下,终结点必须确认它要完成的. 阅读全文

WCF 第一章 基础 系列文章

2011-06-23 11:30 by DanielWise, 8574 阅读, 收藏, 编辑
摘要: 《Essential Windows Communication Foundation 》 系列翻译文章最先从CSDN 上开始翻译,后来转到博客园,现在是将前四章的翻译内容从CSDN搬到博客园上,同时按章节划分不同系列,方便大家查看。以后会继续更新。[第1篇] 基础 微软通信基础是关于服务的。主要是指创建,寄宿,使用以及安全性。WCF是基于标准和互通性的。可以提高开发人员的生产力。简短地说,WCF就是让每一个专业软件开发人员能够使用分布式计算服务。 在这一章,我们主要介绍一些WCF服务如何工作的基础理论。我们主要集中介绍最通用的特性。通过接下来的内容和例子,你将可以在本地或是网间创建并使用WC 阅读全文
点击右上角即可分享
微信分享提示