读书人

wcf 并发有关问题

发布时间: 2013-03-25 15:43:04 作者: rapoo

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接口
{

}
//这样就可以了


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

读书人网 >C#

热点推荐