摘要: 信道栈是由一个或者多个信道组成用来处理消息的分层通信栈。信道可以是协议信道或者传输信道。传输信道位于信道栈的最底层用来在一个传输协议(比如,HTTP,TCP,MSMQ)上传输消息。协议信道(又名层次信道)通转发和修改消息来实现协议(安全,可信赖消息,事务,等等)。 阅读全文
posted @ 2011-06-29 10:09 Gavin Liu 阅读(159) 评论(0) 推荐(0) 编辑
摘要: ICommunicationObject 接口(查看列表3.8)是WCF中所有通信对象(信道,信道工厂,信道监听器,等等)的基础。打算创建自定义信道或者直接使用信道的开发人员需要了解这个接口。WCF中的通信对象需要实现一个特殊的状态机。状态机表示了所有通信对象的状态变化。这种情况就像其他通信对象(比如,套接字)所处理的那样。ICommunicationObject接口(还有与它相关联的方法,状态和事件)的目的是为了实现状态机。这允许WCF能够将按同样的方式处理通信对象,并让他们下层实现与抽象层分离。 阅读全文
posted @ 2011-06-29 10:08 Gavin Liu 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 信道通过信道形状来完成它们所支持的多种类型消息交换模式。比如,一个基于Tcp的传输信道将会实现IInputChannel和IOutputChannel,因为这些通道都是固有单向的。其他的传输信道基于其他协议比如TCP可能需要实现多个信道形状。开发人员不直接与信道形状打交道。对应的,WCF选择一个服务的基于OperationContract的信道形状。 阅读全文
posted @ 2011-06-29 10:07 Gavin Liu 阅读(201) 评论(0) 推荐(0) 编辑
摘要: WCF支持不同的消息交换模式:单向,双工和请求-回复。为了实现每种方式,WCF提供了10种不同的称作信道形状的接口。其中五个形状称作IOutputChannel, IInputChannel, IDuplexChannel, IRequestChannel和IReplyChannel.每个形状都有一个等效的支持会话的形状。它们包括IOutputSessionChannel, IInputSessionChannel, IDuplexSessionChannel, IRequestSessionChannel和IReplySessionChannel.这些接口在一个信道栈中实现了不同的消息交换模式。在这一部分,我们将查看每一个通信模式以及与它们关联的多种接口。 阅读全文
posted @ 2011-06-29 10:06 Gavin Liu 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 信道就是WCF应用程序接收和发送所有信息的通道。它负责在一个持续的方式中准备并传输消息。信道是为传输,协议和消息交换定义的。信道被放到一起来创建信道栈。信道栈是处理消息的分层通信栈。比如,一个信道栈可以由一个TCP传输信道和一个事务协议信道组成。这样的一个信道栈允许使用在网络中的客户端和服务端之间使用TCP协议和事务流转来发送/接收消息。 阅读全文
posted @ 2011-06-29 10:05 Gavin Liu 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 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 阅读(365) 评论(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) 编辑
摘要: 在这一章,我们主要讲述WCF的基础内容,简洁的描述了ABCs.一个服务暴露终结点,每个终结点都有ABCs:地址,绑定和契约。服务也有描述它们的操作语义的行为,比如多线程和同步,但是这些将会在接下来的章节里讲述。 阅读全文
posted @ 2011-06-24 18:11 Gavin Liu 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 就像调用一个WCF服务,你可以使用添加服务引用(ASR)或者Svcutil.exe来创建代理类和配置文件来调用ASMX服务操作。在这些被创 建以后,客户端通过实例化代理调用方法来与ASMX网络服务通信。同样的,你可以使用添加网络服务引用(AWR)或者wsdl.exe 来生成代理类和配置文件。然后在实例被创建以后,客户端在代理上调用方法来和服务通信。 阅读全文
posted @ 2011-06-24 18:10 Gavin Liu 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 一个WCF服务可以在操作系统中运行的任何托管进程中寄宿。服务本身一般并不知道或者关心它是怎么被寄宿的,尽管它可以通过丰富的APIs来找 出来。它可以寄宿到一个不被注意的随机器初始化时启动随机器关闭时关掉的Windows 服务上,或者在一个最小化到Windows系统托盘的客户端应用程序。最普通的用法,就是在IIS里托管一个WCF服务。 阅读全文
posted @ 2011-06-24 18:09 Gavin Liu 阅读(244) 评论(0) 推荐(0) 编辑
摘要: WCF中的元数据是精确描述如何与服务通信的消息。客户端可以向一个运行的服务请求元数据来了解它们要求的终结点和消息格式。在设计时,客户端发送由 WS-MetadataExchange 标准定义的消息并接收返回的WSDL。WSDL可以被客户端用来定义一个将要用来在运行时与服务通信的代理类和配置文件。图片1.4显示了这个交流过程。 阅读全文
posted @ 2011-06-24 17:32 Gavin Liu 阅读(225) 评论(0) 推荐(0) 编辑
摘要: 当需要和服务通信时WCF为客户端提供了丰富的API。通过Service.ServiceModel实现的API处理将.NET类型转换成 XML然后从客户端向服务端发送消息。你可以直接用API编程,或者你可以使用工具生成一个代理类和配置文件。在这一部分,我们将首先说明如何使用代码直 接调用服务,然后我们将使用工具实现这个过程。前一种方法使用较少的代码并不使用配置文件。后一种方式有更少的依赖性而且在调用时有更好的微控性。每种解 决方案都有很多最佳适用情况。 阅读全文
posted @ 2011-06-24 17:32 Gavin Liu 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 服务控制文件web.config 或是 app.config 依赖于服务是如何被寄宿的,它们必须包含一个节点。在这个节点下,服务,绑定,行为,客户端,诊 断,扩展,寄宿环境和COM+互操作都可以被特殊设置。最低限度必须有一个节点用来包含终结点,也至少有一个非基础架构 的节点在节点下面。在节点内,ABCs会被定义在每 一个终结点上。 阅读全文
posted @ 2011-06-24 17:30 Gavin Liu 阅读(203) 评论(0) 推荐(0) 编辑
摘要: WCF为在配置文件中定义服务属性提供了丰富的支持。你仍然需要为你将要在服务中暴露的特性或者算法编码,但是终结点地址,绑定和行为可以从代码中移动到配置文件中。 阅读全文
posted @ 2011-06-24 17:29 Gavin Liu 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 完成一个WCF服务,你要完成一个.NET 类然后使用System.ServiceModel 属性来修饰这个类。System.ServiceModel 命名空间与.NET 3.0 一起安装而且包含了大多数WCF实现。当代码编译时,CLR(公共语言运行库)解释这些属性,使用运行时代码取代它们。对于.NET来说属性并不是新事 物; 在.NET 1.0 时它们已经存在了。WCF,就像.NET 1.0,1.1和2.0 中的ASMX,当写服务时使用属性来提高我们的生产力。 阅读全文
posted @ 2011-06-24 17:27 Gavin Liu 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 在一个高的等级里,写一个WCF服务就像写其他服务一样,不考虑内部实现。你首先要写一些代码来实现一个功能;然后你在一个操作系统进程中运行这些代码, 这个进程监听请求回复。WCF将这些步骤正式化而且使程序员能够更加容易的处理每一个节点。比如,使用系统提供的绑定和编码器,WCF 服务将可以与标准的SOAP消息通信。默认情况下,多线程,并发和实时也可以很好的实现而且有可预见的行为。 阅读全文
posted @ 2011-06-24 17:25 Gavin Liu 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 微软通信基础是关于服务的。主要是指创建,寄宿,使用以及安全性。WCF是基于标准和互通性的。可以提高开发人员的生产力。简短的说,WCF就是让每一个专业软件开发人员能够使用分布式计算服务。 阅读全文
posted @ 2011-06-24 17:22 Gavin Liu 阅读(235) 评论(0) 推荐(0) 编辑
摘要: MS-SQL Server 使用以下资源锁模式。 锁模式 描述 共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。 更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。 排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。 意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 架构锁 在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。 大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。 阅读全文
posted @ 2011-03-08 16:36 Gavin Liu 阅读(316) 评论(0) 推荐(0) 编辑
摘要: HTTP Error 404.13 - Not Found The request filtering module is configured to deny a request that exceeds the request content length. 查看C:\Windows\System32\inetsrv\config目录下的applicationhost.config,可以在system.webServer/security/requestFiltering/中找到requestLimits设置项 阅读全文
posted @ 2011-03-08 16:32 Gavin Liu 阅读(1235) 评论(0) 推荐(0) 编辑
摘要: IIS 6.0 的莫名上传错误(ASP错误:0104:0x80004005 ) Windows2003,当在IIS6上下载(/上传)大文件时,   会出现错误(log文件中):80004005Response_Buffer_Limit_Exceeded。   原因:IIS6有一个缺省的设置:AspBufferingLimit=4194304是4M。   解决办法:将AspBufferingLimit的值增大到合适的大小。 阅读全文
posted @ 2011-03-08 16:29 Gavin Liu 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 功能:对单表数据生成insert语句 约束:1. 只能单表    2. insert语句包括主键数据    3. 不进行数据有效性检查 4. 采用了简单数据处理,如果对表中含了不可转换成varchar的列,则有可能失败 5. 行中有null值的行将失败 6. 执行生成的insert语句组前,如果表有自编号字段,请先使用set identity_insert 表名 on,允许insert自动编号数据 阅读全文
posted @ 2010-08-19 11:13 Gavin Liu 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 用一条SQL语句实现斐波那契数列1,1,2,3,5,8,13,21,....,能办到吗? 当然能. 阅读全文
posted @ 2010-06-10 17:07 Gavin Liu 阅读(869) 评论(0) 推荐(0) 编辑
摘要: 大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码,C#有没有方法可以直接都用这些原本已经存在的功能呢?答案是肯定的,大家可以通过C#中的DllImport直接调用这些功能。 阅读全文
posted @ 2010-06-10 16:46 Gavin Liu 阅读(483) 评论(0) 推荐(0) 编辑
摘要: 习惯用C#写东西,但平时又会碰到很多要用win32 API的地方,所以经常要用DllImport,但win32函数的类型写法是很庞杂的,相信为之困扰的不止我一个... 阅读全文
posted @ 2010-06-10 16:43 Gavin Liu 阅读(303) 评论(0) 推荐(0) 编辑

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