📜  WCF-实例管理(1)

📅  最后修改于: 2023-12-03 15:35:39.861000             🧑  作者: Mango

WCF - 实例管理

在 WCF 中,我们可以配置服务实例的工作方式,使其更好地适应我们的应用程序需求。实例是指包含服务类的对象,用于处理来自客户端的请求。

WCF 提供了三种实例管理模式:

  1. Per-Call 模式

Per-Call 模式是默认的实例管理模式,每个客户端请求都将创建一个新的服务实例,请求处理完毕后即关闭该实例。这种模式适合处理无状态请求,优点在于:

  • 对于不会长时间打开的连接(短连接),可以显著减少消耗;
  • 避免了资源锁定和潜在的不一致状态,因为它处理的是无状态请求;
  • 可以更好地实现可伸缩性。
  1. Singleton 模式

Singleton 模式是创建一个单例实例,它在应用程序的生命周期内被共享。任何客户端请求都将使用同一个实例进行处理。这种模式适合处理状态共享的请求,但需要注意以下几点:

  • 必须处理多个线程同时使用该实例的情况;
  • 必须使用线程同步技术来避免多个线程并发访问同一实例造成的问题;
  • 必须密切关注应用程序的内存使用情况,因为单例实例占用的内存将随着程序运行时间的增加而增加。
  1. Per-Session 模式

Per-Session 模式是在会话期间使用单个实例来处理所有客户端请求。当客户端第一次请求时,WCF 将创建一个新的服务实例,该实例将用于客户端会话的期间,直到会话终止或被超时。这种模式适合处理需要保持状态的请求,但需要注意以下几点:

  • 每个连接都会占用一些资源,如果连接数很多,将严重影响系统性能;
  • Session 需要存储在内存中,如果客户端数很多或者 Session 数据量很大,将占用大量的内存空间;
  • 要确保及时释放不再需要的 Session。

代码示例

设置实例管理模式

可以使用下面的 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 模式

以下是一个使用 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 模式

以下是一个使用 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 来计算客户端请求次数。