摘要: 使用DataContract序列化器在客户端和服务端之间将CLR类型转换成基于标准的XML的序列化。然而有很多场景并不适合使用DataContract序列化器。这包括不支持DataContract序列化器的对已存在的CLR类型的序列化,原有的Web 服务,交互系统,代码合并(比如.NET Remoting)和数据形状。数据形状是指控制一个用来性能优化和契约优先开发的序列化成XML的.NET类型的过程。在这些情况下,了解如何使用WCF和.NET Framework提供的序列化工具是很重要的。 编码是另外一个与序列化相关的重要主题。WCF在对象序列化和将消息转换成可以使用一个传输协议发送的字节间做了很多区别。 阅读全文
posted @ 2011-06-30 10:08 Gavin Liu 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 行为是WCF架构中一个重要的扩展点。它们在客户端或者服务端运行时(runtime)被构造时以及每个服务调用时使用。当运行时启动时,它通过检测传递给ClientChannel的类型结构或者ServiceHost来寻找行为,然后在配置文件中寻找。行为也可以在代码中和在打开ServiceHost之前添加到ServiceDescription 对象中定义,或者通过在代码中使用属性,或者在配置文件中。 阅读全文
posted @ 2011-06-30 10:03 Gavin Liu 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 实现了对在服务端配置中安装的软件授权码的一个验证行为。如果它不存在或者它不合法,服务将不会启动。它显示了服务运行时创建的用来验证配置信息的一个终结点行为。它也显示了当服务运行时创建时调用的一个行为扩展和扩展是如何将行为加入到服务运行时的。结果就是一个自定义行为在配置文件中(app.config 或者web.config)使用并被添加到服务运行时中以便于配置信息可以在服务启动时被验证。 阅读全文
posted @ 2011-06-30 10:02 Gavin Liu 阅读(154) 评论(0) 推荐(0) 编辑
摘要: 有一些重要的用来处理安全的行为。这些会在第八章”安全”中讲述,但是理解他们作为行为的作用是很值得的。 ServiceCredentials 行为是一个用来确定一个服务的认证的服务行为。这个类对访问客户端安全信息是有用的,比如用户的Windows验证设置和客户端证书。它以一个行为的形式实现以便于它可以按照它们的安全信息检测进入的消息。 阅读全文
posted @ 2011-06-30 10:02 Gavin Liu 阅读(155) 评论(0) 推荐(0) 编辑
摘要: 类myParameterInspector实现了IParemeterInspector接口。类存储了两个本地属性,_pattern和_message,用来在BeforeCall方法中验证参数。在那个方法中,使用正则表达式来匹配参数值和参数pattern.如果值与pattern不符合,会抛出一个错误。 阅读全文
posted @ 2011-06-30 10:00 Gavin Liu 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 实际应用时,如果你需要为诊断的目的实现一个消息检测器,请查看第十章”异常处理”以获得跟踪技术。 myMessageInspector 类实现了IDispatchMessageInspector接口。在它的BeforeSendRequest和AfterReceiveReply方法中它把消息打印到控制台。类myEndpointBehavior实现了IEndpointBehavior接口。在它的AddDispatchBehavior方法中它把myMessageInspector类添加到消息检测器列表中以便于可以被每一条消息调用。最后,主程序将myEndpointBehavior类添加到所有终结点的行为列表中。注意因为服务也有一个MEX终结点,对终结点的请求和回复也会被myEndpointBehavior打印出来。 阅读全文
posted @ 2011-06-30 09:59 Gavin Liu 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 自定义行为可以在WCF创建运行时和消息处理管道时让你在重要的地方插入代码。行为可以添加到代码中,通过属性或配置文件手动实现服务描述。在所有的情况中,代码可以做一些辅助动作,比如在一个目录中寻找信息或者为了审计的目的记录数据。 阅读全文
posted @ 2011-06-30 09:58 Gavin Liu 阅读(382) 评论(5) 推荐(0) 编辑
摘要: 定义在操作层的行为TransactionScopeRequired和TransactionAutoComplete。在服务层,有两个额外的行为需要考虑: TransactionIsolationLevel和TransactionTimeout. 阅读全文
posted @ 2011-06-30 09:57 Gavin Liu 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 事务管理器负责协调多个部分间的工作并通过资源管理器提交工作。资源管理器负责处理可信赖,持续存储。取决于使用的资源和服务或应用跨越的边界,WCF将使用三个事务管理器中的一个来完成事务处理。轻量级事务管理器(LTM)用来在一个应用程序域中管理资源。核心事务管理器(KTM),仅仅存在于Vista 和Windows Server 2008 系统中,用来管理文件系统和注册表资源的事务。分布式事务管理器(DTC)用来管理跨程序,进程或者机器边界的事务。应用程序不控制具体使用哪一个事务管理器;WCF将会选择最合适的事务管理器并在没有应用程序干预的情况下按需要逐步扩大。 阅读全文
posted @ 2011-06-30 09:55 Gavin Liu 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 当在分布式系统中工作时,事务有时必须要跨越服务边界。例如,如果一个服务管理客户信息而另一个服务管理订单,一个客户提交一个订单并想产品可以发送到一个新的地址,系统将需要调用每个服务上的操作。如果事务完成,用户将会期待两个系统上的信息都被合适的更新。 如果基础架构支持一个原子事务协议,服务可以像刚才描述的那样被组合到一个复合事务中。WS-AT(网络服务原子事务)提供在参与的服务间共享信息的平台来实现ACID事务必须的两步语义提交。在WCF中,在服务边界间的流事务信息被称作事务流。 阅读全文
posted @ 2011-06-30 09:54 Gavin Liu 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 为了在WCF中实现这个行为,服务操作必须使用[OperationBehavior(TransactionScopedRequired=true)]属性来标记为是可事务化的。这指导WCF创建一个新的事务并在将控制权给那个方法前把执行线程入列。如果操作在它完成前失败了,所有在事务中进行的对事务资源的部分更新都将被回滚。 阅读全文
posted @ 2011-06-30 09:53 Gavin Liu 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 有两个场景一般用作事务的参考。多步骤商业过程是典型跨度分,天,月的长时间运行过程。它们可以涉及多个组织和基于人的工作流。短期运行事务是那些在几秒钟完成并很少有外部依赖的商业操作。尽管它们都有定义的很好的接口和确定的工作流,它们是根本不同的事物。WCF支持短期运行的事务。它通过借助.NET和Windows基础结构来实现运行在只有微软环境平台的事务同时通过使用WS-*标准事务来支持跨平台。 阅读全文
posted @ 2011-06-30 09:51 Gavin Liu 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 既然是面向服务,那么如何定义服务,如何提供服务,如何寻找服务,如何使用服务呢? WCF 主要关注如何如何提供服务,如何使用服务,而服务一般都不在本地,但你可以知道服务的地址(WCF),也可以不知道服务的地址(云),而WCF就是为了让分布式服务对开发人员就像本地服务一样,负责处理了通信,编码,安全,可信赖,事务等具体事宜。通信,编码,安全和事务不是我们本篇要讨论的内容,这里我们主要讨论一下可信赖消息。 阅读全文
posted @ 2011-06-30 09:50 Gavin Liu 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 一个服务的ABCs-它的地址,绑定和契约-是以元数据的形式表示的以便于潜在的客户端知道到哪里,该如何与谁去通信。信息统称为服务元数据。服务行为元数据是大多数程序员遇到的第一个行为,因为当你创建WCF工程时它被引用于由Visual Studio 2008生成的配置文件里。这个行为与一个元数据终结点一起工作以便于元数据可以被客户端访问。 阅读全文
posted @ 2011-06-30 09:49 Gavin Liu 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 当InstancingMode被设置成PerSession时,WCF为每个连接到服务端的会话创建一个实例。为了控制连接到一个服务端的会话数量,可以使用maxConcurrentSessions行为。当达到最大值时,下一个客户端尝试创建的会话将会阻塞直到另外一个会话关闭。这个设置对限制可以连接到服务端的用户(或客户端或服务器端)的数目是很有用的。 阅读全文
posted @ 2011-06-30 09:47 Gavin Liu 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 当InstancingMode设置成Single时,WCF在宿主内创建一个单一的实例,不考虑有多少客户端被创建。当ConcurrencyMode设置成Multiple时,WCF为每个请求创建一个线程(取决于系统上限)以实现服务方法的并行执行。为了减少这个,maxConcurrentCalls行为控制有多少个并发调用可以激活。 阅读全文
posted @ 2011-06-30 09:46 Gavin Liu 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 默认情况下,WCF 宿主将会启动尽可能多的实例来处理请求消息。如果一个服务的实例和并发行为并没有确定,WCF将会为每个进入的请求创建一个服务实例同时将按照需要分配线程来反应请求。总体来说这是一个对性能和扩展性都很好的解决方案因为服务将会最大化扩展硬件性能。 但是有很多情况你可能想舍弃使用这种行为。为了这个目的,有三种在并发和实例上的设置可以实现。这些定义在配置文件的行为组分的serviceThrottling元素里。 maxConcurrentInstances行为控制有多少个服务实例可以被一个服务创建。这个设置是有用的如果ConcurrencyMode是PerCall或者PerSession,因为这两个设置都可以指导WCF按照要求创建实例。通过定义WCF可以创建的实例的最大数目,你设置的实例数目的上限将会存储在内存中。当限制达到时,不会有更多的实例被创建除非其他实例被回收或重用。 阅读全文
posted @ 2011-06-30 09:45 Gavin Liu 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 会话在分布式应用程序中广泛用于维护每个用户的状态。在站点或者基于站点的应用中,将每个用户的状态存储于会话中很常见。这这些情况中,用户和会话间有一个1:1比例。WCF以一个类似的概念支持服务。使用InstanceContextMode.PerSession设置,WCF可以直接为每个会话创建一个服务实例。 阅读全文
posted @ 2011-06-30 09:43 Gavin Liu 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 有很多情形需要一个服务对应一个服务实例,而且实例仅可以运行一个线程。任务应该严格的按照FIFO(先进先出)顺序执行,没有并发。尽管这个严重降低吞吐量,这有利于那些状态在所有调用者间共享且它们没有足够的锁定机制存在的场景。 为了创建一个仅有一个单一线程的单一服务实例,InstanceContextMode.Single 应该与ConcurrencyMode.Single一起使用。InstanceContextMode.Single设置意味着仅有一个实例应该被创建,而ConcurrencyMode.Single设置指导WCF在某一时刻只能在一个线程中执行一个实例。这些设置指导WCF按照FIFO(先进先出)顺序分发请求。 阅读全文
posted @ 2011-06-30 09:42 Gavin Liu 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 默认的InstanceContextMode行为设置指导WCF为每个请求创建一个新的服务实例。然后在很多情况下,这不是最好的解决方案。例如,如果一个服务有一个代价很高的例行初始化(比如,一个构造器从一个数据库读取数据或者创建一个大的内存结构),它对每个服务请求的实例创建都不是很高效。为了创建一个被当前线程共享的单一服务实例,InstanceContextMode.Single应该与ConcurrencyMode.Multiple结合使用。InstanceContextMode.Single意味着只能有一个实例被创建,而ConcurrencyMode.Multiple设置指导WCF在那个实例中同时执行多个线程。这可以提供一个重要的扩展性改进,但是服务代码必须处理同步来保护TLS(本地线程空间)。 阅读全文
posted @ 2011-06-30 09:41 Gavin Liu 阅读(405) 评论(0) 推荐(1) 编辑
摘要: ConcurrencyMode.Single和InstanceContextMode.PerSession.当使用这些设置和一个不支持会话的绑定时,比如basicHttpBinding,WCF创建为每个它接收到的请求创建一个新的服务实例并在它自己的线程里执行代码 阅读全文
posted @ 2011-06-30 09:40 Gavin Liu 阅读(262) 评论(0) 推荐(0) 编辑
摘要: 并发是一个多少个任务可以同时执行的度量,以任务(请求,工作,事务,以及类似的)的形式度量。执行时间是一个任务多长时间完成的度量,以时间(毫秒,秒,其他的时间单位等)度量。吞吐量是在一个指定时间里可以完成多少个任务的度量,以任务/时间(请求/秒, 事务/分,等等)的形式度量。吞吐量是关于并发和执行时间的函数。 有两种方式来增加吞吐量:减少执行时间或者增加并发量。减少一个独立任务的执行时间可以通过改变任务调度间隔算法或者添加额外的硬件资源,所以WCF对这些都无能为力。并发可以通过并行执行任务来实现。WCF有两种控制并发的行为: InstanceContextMode 和 ConcurrencyMode. 阅读全文
posted @ 2011-06-30 09:38 Gavin Liu 阅读(244) 评论(0) 推荐(0) 编辑
摘要: 行为是WCF影响运行时操作的类。行为作为WCF运行时被调用,在客户端和服务端运行并作为消息在两者之间流转。因为行为运行在这些重要的时间,它们被用来实现很多WCF的内建特性。它们也是一个重要的自定义扩展点。 例如,ServiceHost用来定义一个服务端的实例和并发方面,另外也分发消息给适当的操作。当一条消息被一个服务接收到并分发给一个类的特定方法时,ServiceHost应该为每次请求创建一个类的实例还是重用实例?但ServiceHost调用类的方法时,它需要加入到一个事务的列表中吗?这些都在行为中定义并且在初始化中使用。 阅读全文
posted @ 2011-06-30 09:37 Gavin Liu 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 信道架构把一系列分布式编程技术统一为一个单独的编码模型。这个架构允许服务独立于传输协议和编码协议而创建,因此支持多种通信形式。绑定是支持特殊通信类型的预先设置好的信道栈。WCF提供9种预定义绑定。 阅读全文
posted @ 2011-06-29 10:31 Gavin Liu 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 通过在一个服务中使用多个终结点,你可以配置一个服务通过多个绑定暴露它的能力,这就像在第二章”一个服务中的多个契约和终结点”描述的那样。这意味着客户端可以使用更多被支持的可选绑定来连接到服务端。通用的场景是使用netTcpBinding绑定把一个服务暴露给一个.NET应用程序,使用wsHttpBinding绑定把同样的服务暴露给一个Java应用程序,使用basicHttpBinding绑定再次把服务暴露给原有的旧的客户端。 阅读全文
posted @ 2011-06-29 10:30 Gavin Liu 阅读(276) 评论(0) 推荐(0) 编辑
摘要: WCF在预设绑定中提供了很多信道和编码器。这些信道提供了在自定义绑定中使用的绑定元素。这一部分提供WCF内部绑定元素列表以及它们的使用方面。传输信道存在于TCP,HTTP,命名管道,HTTP(SSL/TSL加密),MSMQ和对等网络。 阅读全文
posted @ 2011-06-29 10:29 Gavin Liu 阅读(196) 评论(0) 推荐(0) 编辑
摘要: 有很多时候预先设置好的绑定不满足你的服务的需求。一般的场景包含了自定义安全和额外传输协议,都不被WCF支持。一个例子是WCF中不支持UDP协议。对UDP协议的支持是以Windows SDK 中的例子来实现的。考虑到这些情况所以WCF提供了创建自定义绑定的能力。自定义绑定可以由代码或配置文件创建。一个自定义绑定的代码使用System.ServiceModel.Channels命名空间中的CustomBinding 类来生成。这个类暴露了一个你可以添加绑定元素的绑定元素集合。这允许你构造一个基于一系列现有绑定元素的新的绑定。 阅读全文
posted @ 2011-06-29 10:28 Gavin Liu 阅读(213) 评论(0) 推荐(0) 编辑
摘要: msmqIntegrationBinding 绑定用来在一个WCF应用程序和一个直接利用MSMQ的应用程序间通信-比如,使用System.Messaging.这允许开发人员利用WCF同时也使用他们已有的MSMQ应用程序。msmqIntegrationBinding绑定允许MSMQ消息映射到WCF消息。这通过在MsmqMessage类中对MSMQ消息包装来实现的。类位于System.ServiceModel.MsmqIntegration命名空间里。实例可以使用单向契约被发送或接收。 阅读全文
posted @ 2011-06-29 10:27 Gavin Liu 阅读(172) 评论(0) 推荐(0) 编辑
摘要: MSMQ 为使用队列创建分布式应用程序提供支持。WCF支持将MSMQ队列作为netMsmqBinding绑定的底层传输协议的通信。netMsmqBinding绑定允许客户端直接把消息提交到一个队列中同时服务端从队列中读取消息。客户端和服务端之间没有直接通信过程;因此,通信本质是断开的。也意外着所有的通信必须是单向的。因此,所有的操作必须要在操作契约上设置IsOneWay=true属性 阅读全文
posted @ 2011-06-29 10:26 Gavin Liu 阅读(220) 评论(0) 推荐(0) 编辑
摘要: WCF使用微软消息队列(MSMQ)来提供基于队列的通信能力。有两个使用MSMQ的绑定: netMsmqBinding和msmqIntegrationBinding. netMsmqBinding绑定一般在创建以WCF和MSMQ作为传输方式的应用程序时使用。msmqIntegrationBinding绑定用来于一个已有的MSMQ应用程序进行交互。 阅读全文
posted @ 2011-06-29 10:24 Gavin Liu 阅读(166) 评论(0) 推荐(0) 编辑
摘要: 开发人员需要知道绑定的性能和可扩展性特点。当你在与现实中的应用程序打交道时,性能和可扩展性对服务层次的协议和用户体验很重要。用户会对性能表现差的应用抱怨。应用通常不扩展意味着商业对象的需求没有被满足。服务在四个不同的绑定上暴露出来: netNamedPipeBinding, netTcpBinding, wsHttpBinding和basicHttpBinding.一个测试客户端依次调用Get256Bytes操作50,000次来比较绑定间的不同。 阅读全文
posted @ 2011-06-29 10:23 Gavin Liu 阅读(305) 评论(0) 推荐(0) 编辑
摘要: wsDualHttpBinding绑定类似于wsHttpBinding绑定,它额外支持双向通信但不支持传输级别的安全。双向通信通过两个形状改变绑定元素完成: OneWayBindingElement和CompositeDuplexBindingElement绑定元素。CompositeDuplexBindingElement绑定元素在两个单向信道上加了一个双向通信信道。wsDualHttpBinding绑定使用HttpTransportBindingElement绑定元素。这是传输仅支持请求-回复消息交换模式。OneWayBindingElement 绑定元素允许HttpTransportBindingElement绑定元素与CompositeDuplexBindingElement绑定元素一起使用。 wsDualHttpBinding绑定不支持传输层次的安全。这意味着在使用wsDualHttpBinding绑定时不可以使用SSL/TLS加密。 阅读全文
posted @ 2011-06-29 10:22 Gavin Liu 阅读(348) 评论(0) 推荐(0) 编辑
摘要: .NET Framework 3.5 介绍了一种用于Web 服务交互称为ws2007HttpBinding绑定的新的绑定。这个绑定类似于ws2007HttpBinding绑定除了它支持最新的WS-* 消息,安全,可信赖消息和事务标准。 阅读全文
posted @ 2011-06-29 10:21 Gavin Liu 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 对WS-* 标准的支持一直贯穿于WCF架构中。wsHttpBinding绑定是这个支持的一个例子。这个绑定提供了在异构平台上交互通信的能力同时提供了高级架构级别的协议,比如安全,可信赖消息和事务。wsHttpBinding绑定是.NET Framework 3.0 的默认绑定,当你需要基于网络服务的交互通信时。 阅读全文
posted @ 2011-06-29 10:20 Gavin Liu 阅读(235) 评论(0) 推荐(0) 编辑
摘要: Web 服务时异构系统之间进行通信的基础。高级Web 服务是那些使用WS-*规格(显著的WS-星号)的Web 服务。WCF已经支持WS-*标准,包括安全,可信赖消息和事务。 阅读全文
posted @ 2011-06-29 10:17 Gavin Liu 阅读(159) 评论(0) 推荐(0) 编辑
摘要: Web 服务时异构系统间相互通信的基础。比如,基于JAVA平台创建的IBM Websphere或者BEA WebLogic服务必须与基于.NET 平台创建的客户端和服务端进行无缝连接。基于.NET平台创建的服务必须与基于JAVA平台创建的客户端和服务端进行无缝连接。在WCF出现之前,ASP.NET Web 服务(ASMX)和高级Web 服务在.NET平台上提供了这种能力。在.NET 3.0时,WCF直接取代了这些技术并提供了一个单独的统一的架构来创建Web 服务。WCF包括了很多种暴露交互式Web 服务的绑定,包括basicHttpBinding, wsHttpBinding, wsDualHttpBinding和wsFederationHttpBinding绑定。 阅读全文
posted @ 2011-06-29 10:16 Gavin Liu 阅读(168) 评论(0) 推荐(0) 编辑
摘要: 进程间,跨进程,通信就是在同一台机器上的两个独立进程间的通信。进程内,或者在进程中,通信就是在一个进程内两个软件模块的通信。这些通信类型一起组成了我们所称的本机通信。 应用程序域是通过进一步对一个Windows进程拆分并将多个.NET应用程序在安全性和活动范围层次进行隔离的.NET中的架构。这意味着应用程序域是另一个可以被.NET程序跨越的边界。因为这些我们定义了两个额外的名词: 应用程序域间和内部应用程序域。 应用程序域间或者跨应用程序域。在同一个Windows进程内运行的独立应用程序域是两个.NET应用程序进行通信的场所。也可以在一个单独的设计可以运行多个应用程序域的.NET应用程序中进行通信。 阅读全文
posted @ 2011-06-29 10:14 Gavin Liu 阅读(351) 评论(0) 推荐(0) 编辑
摘要: WCF把所有在.NET应用程序之间使用的绑定加上”net”前缀。绑定名字的前缀是一个暗示,让我们知道应该选择一个特定的绑定来使用。这意味着这些绑定有特殊的仅能用于.NET应用程序的特性。相反的,所有以”ws”为前缀的绑定意味着使用Web Services的非.NET应用程序。 阅读全文
posted @ 2011-06-29 10:12 Gavin Liu 阅读(285) 评论(0) 推荐(0) 编辑
摘要: WCF 第四章 绑定 选择一个合适的绑定 2011-06-26 19:40 by DanielWise, 32 visits, 收藏, 编辑 WCF中有9个预设绑定。这些绑定中的每一个都满足一个特殊分布式计算的需求。很多因素决定了为一个特殊应用选择哪一个绑定,包括安全,互通性,可信赖,性能和事务需求。 阅读全文
posted @ 2011-06-29 10:11 Gavin Liu 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 信道栈是一个由一个或多个信道组成用来处理消息的层次通信栈。绑定是预先设置的信道栈。它们代表了在客户端和服务端之间的线上契约。每个绑定由通信中涉及的传输,编码和协议确定。WCF使用绑定为多样化通信场景集合配置信息。最普通的通信场景,比如网络服务,REST/POX 服务和基于队列的应用都在盒子外面提供。例如,basicHttpBinding绑定意味着使用基于ASP.NET Web Services的服务或者与WS-I 基础协议1.1 相适应的服务。ws2007HttpBinding 和wsHttpBinding 绑定类似于basicHttpBinding绑定,但是它们支持更多的特性,比如可信赖消息和事务,而且使用新的标准WS-Addressing. ws2007HttpBinding 绑定继承自.NET 3.5而且比wsHttpBinding基于更新的标准。 阅读全文
posted @ 2011-06-29 10:10 Gavin Liu 阅读(196) 评论(0) 推荐(0) 编辑

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