📅  最后修改于: 2023-12-03 15:35:39.861000             🧑  作者: Mango
在 WCF 中,我们可以配置服务实例的工作方式,使其更好地适应我们的应用程序需求。实例是指包含服务类的对象,用于处理来自客户端的请求。
WCF 提供了三种实例管理模式:
Per-Call 模式是默认的实例管理模式,每个客户端请求都将创建一个新的服务实例,请求处理完毕后即关闭该实例。这种模式适合处理无状态请求,优点在于:
Singleton 模式是创建一个单例实例,它在应用程序的生命周期内被共享。任何客户端请求都将使用同一个实例进行处理。这种模式适合处理状态共享的请求,但需要注意以下几点:
Per-Session 模式是在会话期间使用单个实例来处理所有客户端请求。当客户端第一次请求时,WCF 将创建一个新的服务实例,该实例将用于客户端会话的期间,直到会话终止或被超时。这种模式适合处理需要保持状态的请求,但需要注意以下几点:
可以使用下面的 WCF 配置节代码片段来设置实例管理模式:
<service behaviorConfiguration="MyServiceTypeBehaviors"
name="MyWcfService.MyServiceType">
<endpoint address=""
binding="wsHttpBinding"
contract="MyWcfService.IMyServiceType"/>
</service>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceTypeBehaviors">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceThrottling maxConcurrentCalls="200"
maxConcurrentSessions="100"
maxConcurrentInstances="100"/>
<serviceTimeouts />
<serviceInstance >
<singleton/>
</serviceInstance>
</behavior>
</serviceBehaviors>
</behaviors>
以下是一个使用 Singleton 实例管理模式的示例:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyWcfService : IMyWcfService
{
private static readonly List<string> _data = new List<string>();
public void AddData(string data)
{
lock (_data)
{
_data.Add(data);
}
}
public List<string> GetData()
{
lock (_data)
{
return new List<string>(_data);
}
}
}
使用 [ServiceBehavior]
属性设置了 Singleton 实例模式,同时使用线程同步机制 lock
来确保多个线程访问 _data
时的正确性。
以下是一个使用 Per-Session 实例管理模式的示例:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyWcfService : IMyWcfService
{
private int _count;
public void AddData(string data)
{
// do something
}
public int GetDataCount()
{
return _count;
}
}
我们将 InstanceContextMode
属性设置为 PerSession
,WCF 将为每个会话创建一个新的实例。可以在会话期间保持状态,这里使用 _count
来计算客户端请求次数。