首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

wcf 并发有关问题

2013-03-25 
wcf 并发问题 serviceThrottling maxConcurrentCalls100 maxConcurrentInstances100 maxConcurrent

wcf 并发问题



 <serviceThrottling maxConcurrentCalls="100" maxConcurrentInstances="100" maxConcurrentSessions="100"/>


为什么我改了 并发数 实例数 会话数   并发的操作一直是是只能10个呢。

我将maxConcurrentCalls改为5 可以控制5个并发 大于10就不行...用的是SL ...查了很多资料...没办法..

http://msdn.microsoft.com/zh-cn/library/ms752260.aspx
[解决办法]
自己写一个Attribute配置类,继承Attribute与IServiceBehavior接口

MaxConcurrentCalls //正在处理的最多消息数
MaxConcurrentInstances //服务中可以一次执行的最多 System.ServiceModel.InstanceContext 对象数
MaxConcurrentSessions //对象可一次接受的最多会话数的值


using System;
using System.Collections.ObjectModel;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;

/// <summary>
    /// 吞吐量配置实类
    /// </summary>
    public class ServiceThrottlingAttribute : Attribute, IServiceBehavior
    {
        private ServiceThrottlingBehavior Throttling;

        /// <summary>
        /// 实例化 ServiceThrottlingAttribute 新的实例
        /// </summary>
        public ServiceThrottlingAttribute()
            : this(64, System.Int32.MaxValue, 10)
        {

        }

        /// <summary>
        /// 实例化 ServiceThrottlingAttribute 新的实例
        /// </summary>
        /// <param name="maxConcurrentCalls">指定整个 System.ServiceModel.ServiceHost 中正在处理的最多消息数</param>
        /// <param name="maxConcurrentInstances">指定服务中可以一次执行的最多 System.ServiceModel.InstanceContext 对象数</param>
        /// <param name="maxConcurrentSessions">指定 System.ServiceModel.ServiceHost 对象可一次接受的最多会话数的值</param>
        public ServiceThrottlingAttribute(int maxConcurrentCalls, int maxConcurrentInstances, int maxConcurrentSessions)
        {
            this.Throttling = new ServiceThrottlingBehavior();
            this.MaxConcurrentCalls = maxConcurrentCalls;
            this.MaxConcurrentInstances = maxConcurrentInstances;
            this.MaxConcurrentSessions = maxConcurrentSessions;
        }

        /// <summary>
        /// 获取或设置一个值,该值指定整个 System.ServiceModel.ServiceHost 中正在处理的最多消息数(默认64)。
        /// </summary>


        public int MaxConcurrentCalls
        {
            get { return this.Throttling.MaxConcurrentCalls; }
            set { this.Throttling.MaxConcurrentCalls = value; }
        }

        /// <summary>
        /// 获取或设置一个值,该值指定服务中可以一次执行的最多 System.ServiceModel.InstanceContext 对象数(默认System.Int32.MaxValue)。
        /// </summary>
        public int MaxConcurrentInstances
        {
            get { return this.Throttling.MaxConcurrentInstances; }
            set { this.Throttling.MaxConcurrentInstances = value; }
        }

        /// <summary>
        /// 获取或设置一个指定 System.ServiceModel.ServiceHost 对象可一次接受的最多会话数的值(默认10)。
        /// </summary>
        public int MaxConcurrentSessions
        {
            get { return this.Throttling.MaxConcurrentSessions; }
            set { this.Throttling.MaxConcurrentSessions = value; }
        }

        #region IServiceBehavior 成员

        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceDescription"></param>
        /// <param name="serviceHostBase"></param>
        /// <param name="endpoints"></param>
        /// <param name="bindingParameters"></param>
        public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceDescription"></param>
        /// <param name="serviceHostBase"></param>
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)


        {
            ServiceThrottlingBehavior CurrentThrottling = serviceDescription.Behaviors.Find<ServiceThrottlingBehavior>();
            if (CurrentThrottling == null)
            {
                serviceDescription.Behaviors.Add(this.Throttling);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="serviceDescription"></param>
        /// <param name="serviceHostBase"></param>
        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
        {
        }

        #endregion
    }



将这个配置到WCF服务器端的类中
 

/// <summary>
    /// 消息服务 AddressFilterMode = System.ServiceModel.AddressFilterMode.Any
    /// </summary>    
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, UseSynchronizationContext = false, ConcurrencyMode = ConcurrencyMode.Multiple)]
    [ServiceThrottling(MaxConcurrentSessions = int.MaxValue, MaxConcurrentInstances = int.MaxValue, MaxConcurrentCalls = int.MaxValue)]
    public class WCFService:IWCFService //WCF接口
    {

}
 //这样就可以了


[解决办法]
配置文件就不要配置了,否则可能导致覆盖.
把该节点直接删除

热点排行