.NET 4.6.1中WCF ServiceBehavior的生命周期及实例化时机问询
.NET 4.6.1中WCF ServiceBehavior的生命周期说明
你提供的服务行为配置如下:
<behaviors> <serviceBehaviors> <behavior name="**<<removed>>.ServiceBehavior**"> <serviceThrottling maxConcurrentCalls="300" maxConcurrentSessions="300" maxConcurrentInstances="300" /> <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" /> <serviceDebug includeExceptionDetailInFaults="true" /> <dataContractSerializer maxItemsInObjectGraph="2147483647" /> <serviceCredentials> </serviceCredentials> </behavior> </serviceBehaviors> </behaviors>
针对你的问题,分三部分明确说明:
1. ServiceBehaviorAttribute的实例化时机
你提到的ServiceBehavior类实际是指标记在服务实现类上的ServiceBehaviorAttribute特性,它的实例是在WCF宿主首次加载服务类型时创建,并且在整个服务宿主运行期间只会存在一个实例。配置文件中的<serviceBehaviors>节点是对该特性的配置补充,WCF会在加载服务时将配置值绑定到特性实例上,后续不会重复创建。
2. 服务实例的生命周期(核心疑问点)
你真正关心的“每次调用是否实例化”,其实是指服务类的实例,这由ServiceBehaviorAttribute的InstanceContextMode属性决定(默认值为InstanceContextMode.PerSession):
- PerCall:每次客户端调用服务方法时,都会创建一个新的服务实例,调用完成后立即回收。
- PerSession:每个客户端会话(如TCP/WS绑定默认启用会话)对应一个服务实例,会话结束后实例被回收。
- Single:整个服务宿主生命周期内只存在一个服务实例,所有客户端调用共享该实例(需注意线程安全问题)。
3. 与serviceThrottling配置的关联
你配置中的<serviceThrottling>节点用于限制并发资源:
maxConcurrentCalls:同时处理的调用数量上限maxConcurrentSessions:同时存在的会话数量上限maxConcurrentInstances:同时存在的服务实例数量上限
这些参数会影响服务实例的创建和回收节奏,但不会改变InstanceContextMode定义的生命周期规则。
内容的提问来源于stack exchange,提问作者Creamer77
相关产品推荐
相关产品推荐

