摘要:
当使用WCF寄宿时它能带来很大的灵活性。特别的,WCF服务可以在任何操作系统进程中寄宿。服务宿主,或者仅仅成为"宿主", 负责启动和关闭服务并为控制服务提供基本的管理函数。为一个基于操作性能要求比如可用性,可信赖性和可管理性的服务选择正确的寄宿环境。 IIS和Windows 进程激活服务(WAS)有用来寄宿WCF服务的内建结构。先前特性只在IIS中可用,比如进程激活,回收和身份管理,已经被移植到WAS中并对除了 HTTP协议的所有协议可用。这让WAS成为一个IIS的超级替代者,但是IIS对寄宿基于HTTP的WCF服务是很理想的。WCF通过ASP.NET 兼容模式支持很多AS 阅读全文
posted @ 2011-06-30 10:30
Gavin Liu
阅读(276)
评论(0)
推荐(0)
摘要:
一个WCF服务是一系列终结点集合,每个终结点有一个独一无二的地址。终结点地址和绑定确定了终结点在哪里以及如何监听进入请求。除了终结点地址,服务本身也有地址,称为基地址。 一个服务的基地址用来作为可能在终结点中定义的相对地址的基地址。使用相对地址,而不是绝对地址,终结点地址让在一个服务中管理终结点变得更加容易。通过相对地址,你可以在一个服务中仅通过改变服务基地址就改变所有终结点地址。 当在一个终结点中使用一个相对地址时,相对地址附加到基地址来形成服务基地址。例如,如果一个服务基地址是http://localhost/foo 而终结点地址是bar,终结点将会在http://localhost/fo 阅读全文
posted @ 2011-06-30 10:29
Gavin Liu
阅读(389)
评论(0)
推荐(0)
摘要:
寄宿WCF服务最常用的环境是IIS或者WAS。在一个公共架构上创建,它们都提供鲁棒性进程控制和生命周期回收服务,还有一个熟悉的管理接口。当IIS架构已经在使用时这是对大多数场景来说最合适的解决方案。 然而,也有一些情况你不想在IIS或者WAS中寄宿一个服务。你可能想显式控制事件的启动和停止。或者你可能想提供一个自定义管理接口而不是使用IIS或 者WAS工具。为了实现这个,你可以使用System.ServiceModel命名空间中的ServiceHost类来在任何程序中寄宿一个服务。当你 做这个时,你正在使用一个自我寄宿的WCF服务。 寄宿一个WCF服务最常用的场景是在一个随系统启动和停止的Wi 阅读全文
posted @ 2011-06-30 10:28
Gavin Liu
阅读(266)
评论(0)
推荐(0)
摘要:
将应用程序功能聚集到正确的服务层次是系统设计的一个必须元素。创建一个有很多接口的系统,这个系统也会变得很令人迷惑。创建只有很多接口的一个系统,这个系统会是变成一个很难改变的整体。 在第二章”契约”,我们描述了如何将多个类接口集成到一个单一的终结点中。这是通过.NET接口集成完成的。我们也描述了如何在一个单一服务内部暴露多个 终结点。这一部分提供了一个可供选择的方案。不是通过将两个接口合并为一个然后将聚合作为一个服务暴露出来,这里我们描述的是如何在一个单一的操作系统进 程内分别暴露两个服务。 一个ServiceHost 仅暴露一个服务。所以,为了在一个操作系统进程内暴露多个服务,你需要实现多个S 阅读全文
posted @ 2011-06-30 10:28
Gavin Liu
阅读(433)
评论(0)
推荐(0)
摘要:
在WCF之前,ASMX是ASP.NET Web 服务中一个公共处理方式。它对公共Web服务需求提供了出色的支持并通过ASP.NET HTTP管道提供了鲁棒性扩展能力。在WCF中,服务被设计为不需了解它们的寄宿模且独立传输。所以WCF服务不能依赖于HTTP管道内部的实现,比如 HTTP.SYS。 和ASMX一样,WCF也提供一个鲁棒性扩展模型。但是除了使用HTTP管道,它也采用信道栈。WCF中的信道非常灵活。它们了解传输协议,比如HTTP,但是也了解其他的协议元素比如安全和事务。信道栈在第三章”信道”和第四章”绑定”中描述。 WCF支持IIS中的一个特殊寄宿模型: ASP.NET 兼容模式。当运 阅读全文
posted @ 2011-06-30 10:27
Gavin Liu
阅读(271)
评论(0)
推荐(0)
摘要:
IIS6在Windows 2003和Windows XP SP2中存在,应用程序池作为一个运行时容器来寄宿应用程序。这允许对启动和关闭的控制,在每一个进程的基础上进行身份认证和回收服务。它原本就提供了跨 应用程序的进程隔离功能,这个功能带来了很大的可信赖性。总的来说进程管理是由应用程序池架构处理的。 IIS7在Windows Vista和Windows Server 2008 中存在,进程管理已经实现对多种协议支持并移植到WAS中。ASP.NET也扩展来支持进程激活和WAS中的服务寄宿。 图片7.4 描述了在WAS架构上的IIS7. 在IIS7中寄宿一个服务的三个最小的步骤在第一章描述了。简短 阅读全文
posted @ 2011-06-30 10:26
Gavin Liu
阅读(358)
评论(0)
推荐(0)
摘要:
Windows进程激活服务(WAS)是Vista和Windows Server 2008 自带的寄宿基础。先前的特性只在IIS中才有,比如进程激活,回收和身份标识管理,已经加入到WAS中而且支持所有的协议除了HTTP。 WAS允许你在一个不依赖HTTP协议的鲁棒环境中寄宿服务。HTTP协议被广泛部署和理解,但是有一些情况它并不是最好的选择。 例如,想象有一个为跟踪和分析的目的而接受一条单向消息的服务,消息由客户端发送并最终从网络中断开。为了提供在断开网络时的消息发送能力,需要一个队列 结构。MSMQ协议将会完成这个,而HTTP协议将不会完成这个。或者,想象一个非常"不正式" 阅读全文
posted @ 2011-06-30 10:25
Gavin Liu
阅读(353)
评论(0)
推荐(0)
摘要:
一个服务宿主就是用来管理一个WCF服务的生命周期和上下文服务的一个操作系统进程。服务宿主,或者仅称为”宿主”,负责启动和停止WCF服务并提供一些基本的管理函数来控制WCF服务。除了这方面,宿主对运行在它的内存空间里的WCF服务知道的很少。 阅读全文
posted @ 2011-06-30 10:24
Gavin Liu
阅读(220)
评论(0)
推荐(0)
摘要:
这一章描述了WCF的序列化和编码能力。作为WCF的剩余部分,有很多特性允许你自定义和扩展序列化。使用WCF序列化有如下的一些指导原则: 1. 试着在任何时候和任何可能的地方使用DataContract来序列化。这是WCF中默认的序列化器,意味着可以通过强制显式定义契约来将它用于面向服务开发。 2. 在很多情况中,你将需要依赖XmlSerializer,比如对现有.NET类型的支持,与ASP.NET 网络服务兼容,控制序列化XML的输出结果等。如果你依赖XmlSerializer来进行序列化你需要把[XmlSerializerFormat]放 到你的契约的合适位置。如果你的所有操作都需要使用XM 阅读全文
posted @ 2011-06-30 10:22
Gavin Liu
阅读(211)
评论(0)
推荐(0)
摘要:
之前,你有很多创建分布式应用程序的选择。其中的两个选择是.NET Remoting和ASP.NET 网络服务。.NET Remoting 很适合.NET 应用程序间的通信因为它使用二进制编码传输数据。这比ASP.NET 网络服务提供更好的性能,ASP.NET 网络服务在交互中使用文本编码。由于文本编码允许跨平台交互所以它在ASP.NET 网络服务中是被广泛接受的。WCF将编码架构抽象出来并允许同时使用两种编码格式的绑定存在。这使得WCF可以同时取代.NET Remoting和ASP.NET 网络服务。 阅读全文
posted @ 2011-06-30 10:21
Gavin Liu
阅读(278)
评论(0)
推荐(0)
摘要:
DataContractSerializer是WCF中优先选择的序列化方法。然而,有时你需要使用默认序列化方法以外的方法。一个改变序列化方法的选项是使用XmlSerializer,包括实现自定义序列化的能力,共享类型和支持原有网络服务的能力。对DataContractSerializer,XmlSerializer是WCF集成的一部分。这部分主要查看下XmlSerializer并讨论它如何用来控制XML输出。 阅读全文
posted @ 2011-06-30 10:20
Gavin Liu
阅读(363)
评论(0)
推荐(0)
摘要:
WCF支持两种消息处理模式: 缓冲和流模式。缓冲是WCF中处理消息的默认模式。在这个模式下,整个消息在发送和接收之前被放入内存中。在大多数场景,缓冲消息是重要的而且有时需要支持一些诸如可信赖消息和数字签名的特性。然而,缓冲大消息将很容易导致系统资源耗尽并限制可扩展性。WCF支持另外一种使用流处理消息的模式。在这个模式中,在客户端和服务端的数据使用一个System.IO.Stream.Streaming。流模式一般在一个绑定或一个传输信道上使用。 阅读全文
posted @ 2011-06-30 10:19
Gavin Liu
阅读(246)
评论(0)
推荐(0)
摘要:
有时你可能需要完成一个不可序列化或者需要对序列化内容进行改变的序列化过程。一个例子是由第三方组件提供者提供或者一个你不再拥有源码的组件中的一个类型。 阅读全文
posted @ 2011-06-30 10:18
Gavin Liu
阅读(379)
评论(0)
推荐(0)
摘要:
对支持面向服务的架构来说,数据契约版本化会随着时间推移称为面向服务的一个重要方面。随着时间推移,比如创建了新的服务,它生成了一个数据契约的新版本,通过添加额外的信息。而不是重编译所有之前使用老的数据契约版本的客户端和服务端,你可能希望它们可以平滑的升级以便于可以共享公共数据,这也正是DataContractSerializer 要做的事情。如果有额外的数据,DataContractSerializer 将会抛弃额外的信息。但这并不是在所有情况下都能正常工作。如果数据被接受后又发送回给客户端,忽略任何额外数据意味着可能会丢失信息。一个例子是一个新的客户端发送数据给一个将信息存储在一个数据库中以用来在未来的某个时刻访问的旧服务。在这种情况下,如果客户端发送给服务端过程中有任何额外信息,它将在数据发送回给客户端时丢失。这也是IExentsibleDataObject接口要解决的问题。它提供一个接口给不知道数据契约的外部数据。它通过将反序列化过程中的未知数据存储到一个ExtensibleDataObject类中实现的。 阅读全文
posted @ 2011-06-30 10:17
Gavin Liu
阅读(189)
评论(0)
推荐(0)
摘要:
WCF 中的默认序列化方法是DataContractSerializer. 这是WCF开发组想要大部分开发人员使用的序列化方法因为它强制进行契约共享而非类型共享。这是创建面向服务架构的一个原则。然而,如果你的想法是支持类型一致并在客户端和服务端间共享类型信息那么这个方法并不会为你的设计引入问题,你可以使用NetDataContractSerializer来序列化。就像在之前的”比较WCF序列化选项”章节描述的那样,NetDataContractSerializer与DataContractSerializer本质是类似的,但是额外支持了类型信息共享和引用保留。 阅读全文
posted @ 2011-06-30 10:16
Gavin Liu
阅读(200)
评论(0)
推荐(0)
摘要:
循环引用是指一个对象维持对子对象的引用,子对象还会对其引用。关于循环引用的一个例子是一个子对象维持到父对象的父子关系。这些情况的类型在面向对象编程中很常用。对象维护循环引用的问题是序列化不可能没有对引用保留的支持。任何序列化结构将会在一个试着序列化对象的无终止循环中终止。引用保留允许对使用的数据添加一个引用而不是对数据反复序列化。 阅读全文
posted @ 2011-06-30 10:14
Gavin Liu
阅读(233)
评论(0)
推荐(0)
摘要:
DataContractJsonSerializer支持使用以JavaScript 对象标记作为序列化格式并添加到.NET 3.5 Framework 中。如果从一个使用JavaScript 的网络应用调用服务序列化会工作的很好,特别是ASP.NET AJAX 和Silverlight 网络应用。当使用WebScriptEnablingBehavior行为时会使用DataContractJsonSerializer。对应的,如果WebHttpBehavior行为配置成使用JSON编码也可以使用DataContractJsonSerializer。这些终结点行为指导WCF支持REST/POX 类型服务。你可以查看第十三章"可编程站点"来获得关于属性的信息。现在我们将查看如何直接使用DataContractJsonSerializer并与先前提到的其他序列化结构进行比较。 阅读全文
posted @ 2011-06-30 10:12
Gavin Liu
阅读(337)
评论(0)
推荐(0)
摘要:
XmlSerializer 是WCF中可以用来序列化的第三种方法。XmlSerializer 是已经被.NET2.0 架构内建支持的一个序列化方法。使用XmlSerializer有好几个优势,包括对已有.NET类型的支持,与ASP.NET Web 服务的兼容,和改变XML输出的能力。
WCF支持XmlSerializer以便于它可以与已有的类型一起使用,而DataContractSerializer是特别用于新类型的。对已有类型的支持通常是对已有的应用程序或者那些你没有源码或者你不能重编译的你应用程序来支持DataContract序列化的第三方组件。XmlSerializer也是使用ASP.NET Web 服务使用的序列化方法。这意味着XmlSerializer可以用来帮助将ASP.NET Web 服务转换到WCF中。最后, XmlSerializer对序列化XML的输出提供更多控制并可以用在那些DataContractSerializer不适合对序列化XML形状进行改变的场景中。 阅读全文
posted @ 2011-06-30 10:11
Gavin Liu
阅读(271)
评论(0)
推荐(0)
摘要:
NetDataContractSerializer是WCF中一个可以替代的序列化方法,它允许类型共享。这个类可以再System.Runtime.Serialization命名空间中找到。当类型必须在客户端和服务端保持正确时会使用这个序列化方法。NetDataContractSerializer通过对CLR类型添加额外信息并保存引用来支持类型精确。除了这个,在NetDataContractSerializer和DataContractSerializer之间没有任何不同。 阅读全文
posted @ 2011-06-30 10:10
Gavin Liu
阅读(239)
评论(0)
推荐(0)
摘要:
使用WCF有很多种方式来序列化对象。确定使用哪种方法来序列化取决于一系列因素。这些因素包括你是否想要与契约共享类型,支持现有的.NET类型,保留引用以及更多。
DataContractSerializer
WCF中默认的序列化方法是DataContractSerializer.这个类存在于System.Runtime.Serialization命名空间里。DataContractSerializer是用来支持基于XSD元数据的契约共享的。它将公共语言运行时(CLR)类型映射成XSD定义的类型。这意味着XSD是可以用来在两个应用程序间交换数据的公共元数据。例如,你可以使用XSD在一个.NET应用程序和一个Java应用程序间交换数据。我们使用一个字符串来举个例子。 阅读全文
posted @ 2011-06-30 10:09
Gavin Liu
阅读(285)
评论(0)
推荐(0)
摘要:
使用DataContract序列化器在客户端和服务端之间将CLR类型转换成基于标准的XML的序列化。然而有很多场景并不适合使用DataContract序列化器。这包括不支持DataContract序列化器的对已存在的CLR类型的序列化,原有的Web 服务,交互系统,代码合并(比如.NET Remoting)和数据形状。数据形状是指控制一个用来性能优化和契约优先开发的序列化成XML的.NET类型的过程。在这些情况下,了解如何使用WCF和.NET Framework提供的序列化工具是很重要的。
编码是另外一个与序列化相关的重要主题。WCF在对象序列化和将消息转换成可以使用一个传输协议发送的字节间做了很多区别。 阅读全文
posted @ 2011-06-30 10:08
Gavin Liu
阅读(251)
评论(0)
推荐(0)
摘要:
行为是WCF架构中一个重要的扩展点。它们在客户端或者服务端运行时(runtime)被构造时以及每个服务调用时使用。当运行时启动时,它通过检测传递给ClientChannel的类型结构或者ServiceHost来寻找行为,然后在配置文件中寻找。行为也可以在代码中和在打开ServiceHost之前添加到ServiceDescription 对象中定义,或者通过在代码中使用属性,或者在配置文件中。 阅读全文
posted @ 2011-06-30 10:03
Gavin Liu
阅读(168)
评论(0)
推荐(0)
摘要:
实现了对在服务端配置中安装的软件授权码的一个验证行为。如果它不存在或者它不合法,服务将不会启动。它显示了服务运行时创建的用来验证配置信息的一个终结点行为。它也显示了当服务运行时创建时调用的一个行为扩展和扩展是如何将行为加入到服务运行时的。结果就是一个自定义行为在配置文件中(app.config 或者web.config)使用并被添加到服务运行时中以便于配置信息可以在服务启动时被验证。 阅读全文
posted @ 2011-06-30 10:02
Gavin Liu
阅读(172)
评论(0)
推荐(0)
摘要:
有一些重要的用来处理安全的行为。这些会在第八章”安全”中讲述,但是理解他们作为行为的作用是很值得的。
ServiceCredentials 行为是一个用来确定一个服务的认证的服务行为。这个类对访问客户端安全信息是有用的,比如用户的Windows验证设置和客户端证书。它以一个行为的形式实现以便于它可以按照它们的安全信息检测进入的消息。 阅读全文
posted @ 2011-06-30 10:02
Gavin Liu
阅读(172)
评论(0)
推荐(0)
摘要:
类myParameterInspector实现了IParemeterInspector接口。类存储了两个本地属性,_pattern和_message,用来在BeforeCall方法中验证参数。在那个方法中,使用正则表达式来匹配参数值和参数pattern.如果值与pattern不符合,会抛出一个错误。 阅读全文
posted @ 2011-06-30 10:00
Gavin Liu
阅读(240)
评论(0)
推荐(0)
摘要:
实际应用时,如果你需要为诊断的目的实现一个消息检测器,请查看第十章”异常处理”以获得跟踪技术。
myMessageInspector 类实现了IDispatchMessageInspector接口。在它的BeforeSendRequest和AfterReceiveReply方法中它把消息打印到控制台。类myEndpointBehavior实现了IEndpointBehavior接口。在它的AddDispatchBehavior方法中它把myMessageInspector类添加到消息检测器列表中以便于可以被每一条消息调用。最后,主程序将myEndpointBehavior类添加到所有终结点的行为列表中。注意因为服务也有一个MEX终结点,对终结点的请求和回复也会被myEndpointBehavior打印出来。 阅读全文
posted @ 2011-06-30 09:59
Gavin Liu
阅读(200)
评论(0)
推荐(0)
摘要:
自定义行为可以在WCF创建运行时和消息处理管道时让你在重要的地方插入代码。行为可以添加到代码中,通过属性或配置文件手动实现服务描述。在所有的情况中,代码可以做一些辅助动作,比如在一个目录中寻找信息或者为了审计的目的记录数据。 阅读全文
posted @ 2011-06-30 09:58
Gavin Liu
阅读(401)
评论(5)
推荐(0)
摘要:
定义在操作层的行为TransactionScopeRequired和TransactionAutoComplete。在服务层,有两个额外的行为需要考虑: TransactionIsolationLevel和TransactionTimeout. 阅读全文
posted @ 2011-06-30 09:57
Gavin Liu
阅读(200)
评论(0)
推荐(0)
摘要:
事务管理器负责协调多个部分间的工作并通过资源管理器提交工作。资源管理器负责处理可信赖,持续存储。取决于使用的资源和服务或应用跨越的边界,WCF将使用三个事务管理器中的一个来完成事务处理。轻量级事务管理器(LTM)用来在一个应用程序域中管理资源。核心事务管理器(KTM),仅仅存在于Vista 和Windows Server 2008 系统中,用来管理文件系统和注册表资源的事务。分布式事务管理器(DTC)用来管理跨程序,进程或者机器边界的事务。应用程序不控制具体使用哪一个事务管理器;WCF将会选择最合适的事务管理器并在没有应用程序干预的情况下按需要逐步扩大。 阅读全文
posted @ 2011-06-30 09:55
Gavin Liu
阅读(195)
评论(0)
推荐(0)
摘要:
当在分布式系统中工作时,事务有时必须要跨越服务边界。例如,如果一个服务管理客户信息而另一个服务管理订单,一个客户提交一个订单并想产品可以发送到一个新的地址,系统将需要调用每个服务上的操作。如果事务完成,用户将会期待两个系统上的信息都被合适的更新。
如果基础架构支持一个原子事务协议,服务可以像刚才描述的那样被组合到一个复合事务中。WS-AT(网络服务原子事务)提供在参与的服务间共享信息的平台来实现ACID事务必须的两步语义提交。在WCF中,在服务边界间的流事务信息被称作事务流。 阅读全文
posted @ 2011-06-30 09:54
Gavin Liu
阅读(242)
评论(0)
推荐(0)
摘要:
为了在WCF中实现这个行为,服务操作必须使用[OperationBehavior(TransactionScopedRequired=true)]属性来标记为是可事务化的。这指导WCF创建一个新的事务并在将控制权给那个方法前把执行线程入列。如果操作在它完成前失败了,所有在事务中进行的对事务资源的部分更新都将被回滚。 阅读全文
posted @ 2011-06-30 09:53
Gavin Liu
阅读(268)
评论(0)
推荐(0)
摘要:
有两个场景一般用作事务的参考。多步骤商业过程是典型跨度分,天,月的长时间运行过程。它们可以涉及多个组织和基于人的工作流。短期运行事务是那些在几秒钟完成并很少有外部依赖的商业操作。尽管它们都有定义的很好的接口和确定的工作流,它们是根本不同的事物。WCF支持短期运行的事务。它通过借助.NET和Windows基础结构来实现运行在只有微软环境平台的事务同时通过使用WS-*标准事务来支持跨平台。 阅读全文
posted @ 2011-06-30 09:51
Gavin Liu
阅读(218)
评论(0)
推荐(0)
摘要:
既然是面向服务,那么如何定义服务,如何提供服务,如何寻找服务,如何使用服务呢? WCF 主要关注如何如何提供服务,如何使用服务,而服务一般都不在本地,但你可以知道服务的地址(WCF),也可以不知道服务的地址(云),而WCF就是为了让分布式服务对开发人员就像本地服务一样,负责处理了通信,编码,安全,可信赖,事务等具体事宜。通信,编码,安全和事务不是我们本篇要讨论的内容,这里我们主要讨论一下可信赖消息。 阅读全文
posted @ 2011-06-30 09:50
Gavin Liu
阅读(269)
评论(0)
推荐(0)
摘要:
一个服务的ABCs-它的地址,绑定和契约-是以元数据的形式表示的以便于潜在的客户端知道到哪里,该如何与谁去通信。信息统称为服务元数据。服务行为元数据是大多数程序员遇到的第一个行为,因为当你创建WCF工程时它被引用于由Visual Studio 2008生成的配置文件里。这个行为与一个元数据终结点一起工作以便于元数据可以被客户端访问。 阅读全文
posted @ 2011-06-30 09:49
Gavin Liu
阅读(164)
评论(0)
推荐(0)
摘要:
当InstancingMode被设置成PerSession时,WCF为每个连接到服务端的会话创建一个实例。为了控制连接到一个服务端的会话数量,可以使用maxConcurrentSessions行为。当达到最大值时,下一个客户端尝试创建的会话将会阻塞直到另外一个会话关闭。这个设置对限制可以连接到服务端的用户(或客户端或服务器端)的数目是很有用的。 阅读全文
posted @ 2011-06-30 09:47
Gavin Liu
阅读(268)
评论(0)
推荐(0)
摘要:
当InstancingMode设置成Single时,WCF在宿主内创建一个单一的实例,不考虑有多少客户端被创建。当ConcurrencyMode设置成Multiple时,WCF为每个请求创建一个线程(取决于系统上限)以实现服务方法的并行执行。为了减少这个,maxConcurrentCalls行为控制有多少个并发调用可以激活。 阅读全文
posted @ 2011-06-30 09:46
Gavin Liu
阅读(260)
评论(0)
推荐(0)
摘要:
默认情况下,WCF 宿主将会启动尽可能多的实例来处理请求消息。如果一个服务的实例和并发行为并没有确定,WCF将会为每个进入的请求创建一个服务实例同时将按照需要分配线程来反应请求。总体来说这是一个对性能和扩展性都很好的解决方案因为服务将会最大化扩展硬件性能。
但是有很多情况你可能想舍弃使用这种行为。为了这个目的,有三种在并发和实例上的设置可以实现。这些定义在配置文件的行为组分的serviceThrottling元素里。
maxConcurrentInstances行为控制有多少个服务实例可以被一个服务创建。这个设置是有用的如果ConcurrencyMode是PerCall或者PerSession,因为这两个设置都可以指导WCF按照要求创建实例。通过定义WCF可以创建的实例的最大数目,你设置的实例数目的上限将会存储在内存中。当限制达到时,不会有更多的实例被创建除非其他实例被回收或重用。 阅读全文
posted @ 2011-06-30 09:45
Gavin Liu
阅读(236)
评论(0)
推荐(0)
摘要:
会话在分布式应用程序中广泛用于维护每个用户的状态。在站点或者基于站点的应用中,将每个用户的状态存储于会话中很常见。这这些情况中,用户和会话间有一个1:1比例。WCF以一个类似的概念支持服务。使用InstanceContextMode.PerSession设置,WCF可以直接为每个会话创建一个服务实例。 阅读全文
posted @ 2011-06-30 09:43
Gavin Liu
阅读(243)
评论(0)
推荐(0)
摘要:
有很多情形需要一个服务对应一个服务实例,而且实例仅可以运行一个线程。任务应该严格的按照FIFO(先进先出)顺序执行,没有并发。尽管这个严重降低吞吐量,这有利于那些状态在所有调用者间共享且它们没有足够的锁定机制存在的场景。
为了创建一个仅有一个单一线程的单一服务实例,InstanceContextMode.Single 应该与ConcurrencyMode.Single一起使用。InstanceContextMode.Single设置意味着仅有一个实例应该被创建,而ConcurrencyMode.Single设置指导WCF在某一时刻只能在一个线程中执行一个实例。这些设置指导WCF按照FIFO(先进先出)顺序分发请求。 阅读全文
posted @ 2011-06-30 09:42
Gavin Liu
阅读(210)
评论(0)
推荐(0)
摘要:
默认的InstanceContextMode行为设置指导WCF为每个请求创建一个新的服务实例。然后在很多情况下,这不是最好的解决方案。例如,如果一个服务有一个代价很高的例行初始化(比如,一个构造器从一个数据库读取数据或者创建一个大的内存结构),它对每个服务请求的实例创建都不是很高效。为了创建一个被当前线程共享的单一服务实例,InstanceContextMode.Single应该与ConcurrencyMode.Multiple结合使用。InstanceContextMode.Single意味着只能有一个实例被创建,而ConcurrencyMode.Multiple设置指导WCF在那个实例中同时执行多个线程。这可以提供一个重要的扩展性改进,但是服务代码必须处理同步来保护TLS(本地线程空间)。 阅读全文
posted @ 2011-06-30 09:41
Gavin Liu
阅读(430)
评论(0)
推荐(1)
摘要:
ConcurrencyMode.Single和InstanceContextMode.PerSession.当使用这些设置和一个不支持会话的绑定时,比如basicHttpBinding,WCF创建为每个它接收到的请求创建一个新的服务实例并在它自己的线程里执行代码 阅读全文
posted @ 2011-06-30 09:40
Gavin Liu
阅读(273)
评论(0)
推荐(0)
摘要:
并发是一个多少个任务可以同时执行的度量,以任务(请求,工作,事务,以及类似的)的形式度量。执行时间是一个任务多长时间完成的度量,以时间(毫秒,秒,其他的时间单位等)度量。吞吐量是在一个指定时间里可以完成多少个任务的度量,以任务/时间(请求/秒, 事务/分,等等)的形式度量。吞吐量是关于并发和执行时间的函数。
有两种方式来增加吞吐量:减少执行时间或者增加并发量。减少一个独立任务的执行时间可以通过改变任务调度间隔算法或者添加额外的硬件资源,所以WCF对这些都无能为力。并发可以通过并行执行任务来实现。WCF有两种控制并发的行为: InstanceContextMode 和 ConcurrencyMode. 阅读全文
posted @ 2011-06-30 09:38
Gavin Liu
阅读(267)
评论(0)
推荐(0)
摘要:
行为是WCF影响运行时操作的类。行为作为WCF运行时被调用,在客户端和服务端运行并作为消息在两者之间流转。因为行为运行在这些重要的时间,它们被用来实现很多WCF的内建特性。它们也是一个重要的自定义扩展点。
例如,ServiceHost用来定义一个服务端的实例和并发方面,另外也分发消息给适当的操作。当一条消息被一个服务接收到并分发给一个类的特定方法时,ServiceHost应该为每次请求创建一个类的实例还是重用实例?但ServiceHost调用类的方法时,它需要加入到一个事务的列表中吗?这些都在行为中定义并且在初始化中使用。 阅读全文
posted @ 2011-06-30 09:37
Gavin Liu
阅读(176)
评论(0)
推荐(0)


浙公网安备 33010602011771号