WCF限流操作实际设置方式揭秘
创始人
2024-06-23 23:00:29
0

WCF中有一种操作可以帮助我们减轻程序开发中产生的大负荷问题,以此提高资源的利用率。那么这一方法就是WCF限流。我们就那天将会通过这里介绍的内容详细介绍一下WCF限流的实际设置方法。#t#

WCF限流“允许开发者限制客户端连接数以及服务的负荷。限流可以避免服务的***化,以及分配与使用重要资源的***化。引入限流技术后,一旦超出配置的设置值,WCF就会自动地将等待处理的调用者放入到队列中,然后依次从队列中取出。在队列中等待处理调用时,如果客户端的调用超时,客户端就会获得一个TimeoutException异常。每个服务类型都可以应用限流技术,也就是说,它会影响到服务的所有实例以及服务类型的所有终结点。实现方式是为限流与服务使用的每个通道分发器建立关联。”

WCF限流由ServiceThrottlingBehavior类定义,包括三个重要的属性:MaxConcurrentCalls、MaxConcurrentSessions、MaxConcurrentInstances,它们分别的默认值为16,10和Int.MaxValue。

在翻译过程中,我在查阅MSDN时,发现MaxConcurrentSessions的默认值为64,这让我感觉很奇怪,莫非作者在这里出现了错误。然而经过我仔细地查阅相关资料,发现在WCF的早期版本中,MaxConcurrentSessions的默认值确实为64,但在2006年6月的CTP版本中已经被修改为16。

设置WCF限流值可以通过配置文件,也可以通过编码方式。前者例如:

 

  1. < system.serviceModel> < services> 
  2. < service name = "MyService" behaviorConfiguration = 
    "ThrottledBehavior"> ... < /service>   
  3. < /services> < behaviors> < serviceBehaviors> 
  4. < behavior name = "ThrottledBehavior"> < serviceThrottling 
    maxConcurrentCalls = "12" maxConcurrentSessions = 
    "34" maxConcurrentInstances = "56" />   
  5. < /behavior> < /serviceBehaviors> < /behaviors> < /system.serviceModel>  

 

WCF并没有提供关于限流的特性。但实现该特性的方法非常简单,如下所示:

  1. public class ServiceThrottlingAttribute : Attribute, IServiceBehavior   
  2. {   
  3. private ServiceThrottlingBehavior throttle;   
  4. public ServiceThrottlingAttribute( int maxConcurrentCalls, 
    int maxConcurrentInstances, int maxConcurrentSessions)   
  5. {   
  6. this.throttle = new ServiceThrottlingBehavior();   
  7. throttle.MaxConcurrentCalls = maxConcurrentCalls;   
  8. throttle.MaxConcurrentInstances = maxConcurrentInstances;   
  9. throttle.MaxConcurrentSessions = maxConcurrentSessions; }   
  10. #region IServiceBehavior Members   
  11. void IServiceBehavior.AddBindingParameters(ServiceDescription 
    serviceDescription, ServiceHostBase serviceHostBase, System.Collections.
    ObjectModel.Collection< ServiceEndpoint> endpoints, System.
    ServiceModel.Channels.BindingParameterCollection bindingParameters) { }   
  12. void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription 
    serviceDescription, ServiceHostBase serviceHostBase) {   
  13. ServiceThrottlingBehavior currentThrottle = serviceDescription.
    Behaviors.Find< ServiceThrottlingBehavior>();   
  14. if (currentThrottle == null) { serviceDescription.Behaviors.Add(this.throttle);   
  15. } }   
  16. void IServiceBehavior.Validate(ServiceDescription serviceDescription, 
    ServiceHostBase serviceHostBase) { } #endregion }   

定义的ServiceThrottlingAttribute特性继承了Attribute,并实现了IServiceBehavior接口。在特性内,则使用了ServiceThrottlingBehavior类,以设置WCF限流的相关值。如果要配置服务的限流值,就可以应用该特性,例如:

  1. [ServiceThrottling(12, 34, 56)]   
  2. class MyService : IMyContract,IDisposable {   
  3. public void MyMethod( ) {   
  4. ChannelDispatcher dispatcher = OperationContext.
    Current.Host.ChannelDispatchers[0] as ChannelDispatcher;   
  5. ServiceThrottle serviceThrottle = dispatcher.ServiceThrottle;   
  6. Trace.WriteLine("MaxConcurrentCalls = " + serviceThrottle.
    MaxConcurrentCalls);   
  7. Trace.WriteLine("MaxSessions = " + serviceThrottle.
    MaxConcurrentSessions);   
  8. Trace.WriteLine("MaxInstances = " + serviceThrottle.
    MaxConcurrentInstances);   
  9. } }  

则WCF限流的输出结果为:

MaxConcurrentCalls = 12

MaxSessions = 56

MaxInstances = 34

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
粉嫩如何诠释霸道 东芝M805... “霸道粉”是个什么玩意东芝M805拿过来的时候,笔者扑哧笑了,不是笑这款笔记本,而是笑这款产品的颜色...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
30分钟搞定iOS自定义相机 最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...