勇哥注:
此系列文章是梳理一下勇哥认为项目有用的WCF的知识点,读者须有WCF的开发经验。
WCF的Behavior [运行时改变wcf的行为]
wcf的behavior是wcf的服务运行时提供的功能。如下图:
常用的behavior有三类:
服务行为 [ServiceBehavior]
实例行为,事务行为,并发行为,限制行为
端点行为 [EndPointBehavior]
消息检查,调度行为
操作行为 [OperationBehavior]
参数筛选
服务行为 [ServiceBehavior]
控制实例化,并发行为,事务行为
默认值: Single+PerCall
(1)实例行为
客户端的三次调用,我们是每次调用new homeservice呢?
还是3次调用都是使用的同一个new出来的homeservice实例呢?(Singal单例)
(2)并发行为
指的是你的new homeService出来的实例, 是否接受多线程的调用?还是只接受一个线程的访问?
对于实例行为和并发行为,wcf的默认值:PerCall+ Single
PerCall是实例行为的方式,它指每call一次,new homeService一个实例。
Singal是并发行为的方式,它指只允许单线程访问。
PerCall+ Single: 每次call都会new一个homeservice,每个new都只接受一个线程。
本质上,这种方式也是多线程的。因为你的call1, call2, call3是可以并发进行的。
WCF的Behavior [运行时改变wcf的行为]
常用的behavior有三类:
服务行为 [ServiceBehavior]
实例行为,事务行为,并发行为,限制行为
端点行为 [EndPointBehavior]
消息检查,调度行为
操作行为 [OperationBehavior]
参数筛选
服务行为 [ServiceBehavior]
控制实例化,并发行为,事务行为
默认值: Single+PerCall
实例与并发行为:
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,
ConcurrencyMode=ConcurrencyMode.Single)]
InstanceContextMode取值:
PerCall, (每次访问,不同的new)
PerSession, (每次会话,new一个)
Single (每次访问,同一个new)
ConcurrencyMode取值:
Multiple
Reentrant
Single (单线程)
下面是几种常见的组合:
1。 Single+Singal
这一种就是串行的,安全但是性能差
2。 Single+Multi 单实例(多线程)
这一种风险是,需要自己控制同步
不安全,但是性能优
3。 PreCall+Single(Multi)
设置实例和消息处理的最大值
如果过大的call,会导致机器奔溃,因此需要控制访问数量的安全阈值
在构造函数中配置”安全阈值“,提前评估机器负载和处理能力
这些配置是个死值,其实你还可以根据分钟数,cpu当前利用率来动态拒绝客户的请求,这个档次才高。
MaxConcurrentInstances
设置同一时刻服务上下文实例的最大数量
[perSession和perCall起作用],[对single不起作用]
MaxConcurrentSessions
设置同一时刻可以接受的最大会话数量。
MaxConcurrentCalls
设置serviceHost消息并发处理的最大值。
[Single和Multiple控制线程的数量][对Single也起作用]
每个实例来了,都用一个线程池线程

