摘要: WCF高度利用SOAP于契约定义中。特别的,它使用WSDL来描述服务终结点,使用XSD来描述数据。定义在WSDL中的服务操作用来在运行时把收到的请求转发给正确的.NET类。类似的,通过XSD契约定义的XML文件在运行时被反序列化成.NET类型而且发送给服务操作。合二为一,WSDL和XSD定义提供了对服务实现中的.NET类型一种基于标准的实现。三种类型的契约的详细定义: 服务契约。服务契约描述了由服务实现的功能性操作。 数据契约。数据契约描述了服务通信所依赖的数据结构。一个数据契约把CLR类型序列化成XML并严格选择它们的数据成员。 消息契约。消息契约与类型化和非类型化数据且提供了对SOAP消息头和消息体的精确控制。 阅读全文
posted @ 2011-06-27 15:27 Gavin Liu 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 消息契约描述了发送给一个服务以及从一个服务接收的SOAP消息的结构,并且允许你检测和控制SOAP消息头和消息体中大部分细节。而且数据契约能够让使用XML元数据定义(XSD)标准的系统之间互通,消息契约能够让任何通过SOAP通信的系统互通。 使用消息契约能够通过直接访问SOAP消息头和消息体提供对发送给一个服务以及从一个服务接收的SOAP消息的完全控制。这允许使用简单或复杂的类型来定义SOAP部分的精确内容。就好比当你需要对数据序列化的完全控制时你可以从DataContractSerializer转换到XmlSerializer,当你需要对SOAP消息完全控制时你可以从DataContracts转换到MessageContracts. 阅读全文
posted @ 2011-06-27 15:26 Gavin Liu 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 如果你在使用WCF暴露服务而且使用svcutil.exe来为创建访问服务代码,一般情况下你不需要关心在客户端和服务端间传输的消息的线上表示。数据契约知道WCF把一个.NET类型序列化成一个XML信息集和讲一个XML信息集反序列化成一个.NET类型。XML信息集可能在线上以文件或者二进制形式编码,这些取决于通信过程中所使用的绑定,但是再次,.NET代码不会意识到编码的存在。这种方式就好比你在代码中使用.NET类型但是一个基于标准的XML信息集的编码表示在线上具体传输。 阅读全文
posted @ 2011-06-27 15:19 Gavin Liu 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 变化是不可避免的。企业改变,技术改变,法律改变,软件契约也会改变。在面对软件的变更时,一个坚实的版本控制是必须的。我们必须为不可避免的变化做好提前准备同时对已经存在的客户端进行向后兼容处理。 对数据契约版本控制来说,最常见的需求是想已有的数据契约中添加成员。通过这一部分描述的不间断的描述,你可以自由的做任何改动而不会破坏现有客户端。但是如果你需要打破现有客户端的向后兼容性,你必须通过改变数据契约的名字或者命名空间来定义另一个版本的数据契约。 一个小的注意是要注意不间断的变化。不间断,从WCF的标准来看,可能会打破与其他系统的兼容性。例如,如果与一个要求元数据验证的系统通信,系统可能会拒绝消息如果接收到的XML实例中有不可预期的元素。这一章中提到的不间断周期是指那些不会影响WCF到WCF通信的改变。 阅读全文
posted @ 2011-06-27 15:18 Gavin Liu 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 如果数据类型满足任何先前描述的条件,那么它们会在WSDL中暴露出来。有一些额外的可能,当然,你也可能想强制一个类型包含在WSDL契约中。 举一个类继承的例子。如果一个序列化的派生类到达一个期待得到一个序列化的基类的终结点时,WCF不会知道如何反序列化这个派生类因为它不是契约的一部分。另外一个例子是一个hashtable 类,存储了其他的类作为自己的元素。WSDl将会定义hashtable类,但是不是那么存储在hashtable内部的类。 在这些情况下,你必须告诉WCF这些应该显示包含在WSDL契约中的类。这是使用KnownTypes完成的。它可以在四种方式下完成:通过添加一个KnownType属性到[DataContract],通过在[ServiceContract]或者[OperationContract]的属性,通过在配置文件中添加一个引用给它以及它的程序集,或者通过在生成WSDL时定义它。 阅读全文
posted @ 2011-06-27 15:15 Gavin Liu 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 复杂类型一般在代码中以类的形式实现。复杂类更进一步通过增加特殊结构的继承关系来定义。这种方式,一个通用类型比如”price” 可以派生出为一个更加特殊的类型如”stock price” 或者 “house price”.WCF支持通过在WSDL中合适的表示的类的继承关系,在类结构和XML之间序列化和反序列化它们同时从每个类中取出属性并加入到一个集合中。 阅读全文
posted @ 2011-06-27 15:12 Gavin Liu 阅读(330) 评论(0) 推荐(0) 编辑
摘要: 在一个服务内部,功能性的应用由代码实现的。在服务外部, 功能性服务在WSDL中定义。在一个WCF服务中,应用程序数据在简单和复杂类型表示;而在服务外部,应用程序数据由XML元数据定义表示。WCF数据契约提供了对代码定义的.NET CLR类型与W3C组织定义用来在服务外部通信的XML元数据定义之间的映射。 阅读全文
posted @ 2011-06-27 15:11 Gavin Liu 阅读(208) 评论(0) 推荐(0) 编辑
摘要: WCF 根据服务端源代码中定义的内部类名称和属性来生成外部暴露服务实现。这些实现通过服务中的MEX终结点暴露出来并在设计阶段时被客户端以WSDL形式使用。接下来在客户端,WSDL会被用来写一些代码来建立可以与服务端通信的适当的消息格式。所以你选择的类,方法和参数的名字与服务范围潜在相差很远。 然而,在服务的接口暴露内部名字和外部细节是很不好的形式。比如,你可能有一个叫BurgerMaster的分配算法,你想在外部以Resources名字暴露这个算法。或者可能有内部的编码标准要求你应该命名接口。幸运的是,你可以通过修改[ServiceContract],[OperationContract], [ServiceBehavior]来控制所有服务暴露的名字。 阅读全文
posted @ 2011-06-27 15:08 Gavin Liu 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 一个服务作为一系列终结点被定义的。每个终结点都有一个地址,绑定和契约。契约就是暴露终结点能力的。地址就是这些应用或服务从网络的哪个地址可找到,契约是关于如何访问他们的。 在终结点和契约间有一对多的关系。一个终结点可以只有一个契约,但是一个契约可以被很多终结点引用。尽管一个终结点可以仅仅确认一个契约,接口聚合使能一个单独的契约来暴露多个接口。另外,多个有同样绑定但是不同契约的终结点可以位于同一个地址,给一个单独终结点实现所有契约的假象。 阅读全文
posted @ 2011-06-27 15:05 Gavin Liu 阅读(444) 评论(0) 推荐(0) 编辑
摘要: 为了参与到一个双工消息交换模式中,客户端必须实现WCF的ABCs-必须在客户端定义服务要把消息发送到的地址,指导服务端如何把消息发送给客户端的绑定,定义消息内容和格式的契约。幸运的是,当你生成一个客户端代理而且在运行时使用信道结构时,WCF很大程度上考虑到了这些。 阅读全文
posted @ 2011-06-27 14:57 Gavin Liu 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 一个双向契约包含服务终结点和客户端终结点的接口实现。在契约类型中,服务端契约在客户端实现。 阅读全文
posted @ 2011-06-27 14:55 Gavin Liu 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 你可以通过两个不同消息交换模式来解决双向通信问题。你可以使用两个单向契约,或者你可以使用一个双工契约。 阅读全文
posted @ 2011-06-27 14:53 Gavin Liu 阅读(190) 评论(0) 推荐(0) 编辑
摘要: 请求-回复通信是客户端与服务端最普遍的消息交换模式。通信在客户端被初始化,客户端发送一个请求消息给服务端,然后服务端发送一个返回消息给客户端。如果返回消息很快,那么通信过程可以是同步的,所以客户端应用程序阻塞等待反馈。如果请求和回复之间会有延时,请求-回复模式可以在客户端使用标准.NET技术实现异步调用。在那种情况下,WCF会在发送请求给服务端后立即把控制返回给客户端应用程序。当服务接收到反馈以后,一个.NET回调方法被调用来完成WCF回复。 阅读全文
posted @ 2011-06-27 14:51 Gavin Liu 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 当一个客户端需要向一个服务端发送消息但是不接受返回消息时,但不消息交换模式很有用。使用这个模式,客户端只需要消息成功传递的确认;它不需要服务端返回一个精确的消息。有时单步模式被错误的称作"发后不理"。在实际应用中,它是"发送和理解"因为调用者接收到一个消息成功提交到通信信道的确认。 阅读全文
posted @ 2011-06-27 14:47 Gavin Liu 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 好的设计会降低用户必须等待一个任务结束然后初始化另一个任务之前的情况。例如,当一个e-mail客户端正在下载新邮件,你仍然可以读或者删除已经下载下来的邮件。或者当一个浏览器正在下载一个网页上引用的图片时,你仍然可以拖动网页或者跳转到任何地方。在客户端程序中的多任务形式是通过异步设计模式来完成的。 阅读全文
posted @ 2011-06-27 14:44 Gavin Liu 阅读(193) 评论(0) 推荐(0) 编辑
摘要: WCF使得在客户端和服务端进行请求-回复通信非常容易。在设计阶段,你使用添加服务引用或者svcutil.exe来调用服务元数据终结点而且生成一个客户端代理来模仿服务操作的签名。这允许客户端代码像本地函数调用一样调用代理上的方法。代理把方法名字和参数序列化成一个SOAP消息,然后发送SOAP消息到服务端,然后创建一个.NET类型来表示从服务返回的回复消息。 列表2.1显示一个服务契约定义。一个服务契约和一个操作契约被定义到代码中。操作契约代表一个可以被客户端调用的方法,或者更准确一些的说,一条消息可以被客户端发送并被服务端理解。注意契约在接口中定义,而不是类定义。 阅读全文
posted @ 2011-06-27 14:39 Gavin Liu 阅读(197) 评论(0) 推荐(0) 编辑
摘要: WCF在设计时和运行时使用服务契约。在设计阶段,它们确定应该在WSDL理暴露为终结点的代码的类。一个使用[ServiceContract]标记的类和使用[OperationContract]标记的类中方法在WSDL中暴露以便于它们可以被客户端访问。类以wsdl:service确定,操作以wsdl:operation确定。在运行时,当WCF分开器接收到消息时,它查看wsdl:operation 的名字来确定类中的以[OperationContract]标记的哪个方法需要接受反序列化消息。 阅读全文
posted @ 2011-06-27 14:37 Gavin Liu 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 在原子和金钱世界中,契约是两个或多个组织以一个已知的价格提供商品和服务的合同。在比特和服务的世界中,契约有类似的功能:它是两个或多个组织之间确定消息交换和消息条款及条件的合同。 契约是由服务终结点发送或接收的消息的描述。每一个终结点都由ABCs定义:一个消息发送到的网络上的地址,一个描述消息如何发送的绑定,一个描述消息格式的契约。 阅读全文
posted @ 2011-06-27 14:34 Gavin Liu 阅读(196) 评论(0) 推荐(0) 编辑

Right people get the right information at the right time.
以技术求生存,以市场求发展;学以至用,开拓创新;达技术之颠峰,至市场之广阔!