WCF数据持久化跨会话

3
我们正在开发一个基于WCF的系统。在这个过程中,我们尝试锁定一些数据,使其不被多个用户修改。因此,我们决定创建一个数据结构,其中包含执行锁定逻辑所需的必要信息(例如存储锁定对象的ID)。
我们遇到的问题是在会话之间持久化该数据。有没有什么方法可以避免执行昂贵的数据库调用?我不确定在WCF中如何做到这一点,因为它只能在打开会话期间持久化数据(在内存中)。
4个回答

4

服务实现类的静态成员在会话和调用之间共享。


3

一个选择是像Jimmy McNulty所说的那样使用静态成员。我有一个WCF服务,它根据用户指定的IP地址打开网络连接。我的服务配置为PerCall服务实例模式。在每个会话中,我检查一个静态数据结构,以查看是否已经为指定的IP地址打开了网络连接。以下是一个示例。

[ServiceContract]
public interface IMyService
{
    [OperationContract]
    void Start(IPAddress address);
}

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
public class MyService : IMyService
{
    private static readonly List<IPAddress> _addresses = new List<IPAddress>();
    public void Start(IPAddress address)
    {
        lock(((ICollection)_addresses).SyncRoot)
        {
            if (!_addresses.Contains(address)
            {
                // Open the connection here and then store the address.
                _addresses.Add(address);
            }
        }
    }
}

按照配置,每次调用Start()都在自己的服务实例中进行,每个实例都可以访问静态集合。由于每个服务实例在单独的线程中运行,因此必须同步访问集合。
与多线程编程中的所有同步一样,请确保最小化锁定所需的时间。在示例中,一旦第一个调用者获取锁定,所有其他调用者都必须等待锁定被释放。这在我的情况下起作用,但在您的情况下可能不起作用。
另一种选择是使用Single服务实例模式,而不是PerCall服务实例模式。
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]
public class MyService : IMyService
{ ... }

根据我所了解的,PerCall似乎更加灵活。

你可以通过此链接了解两者之间的区别。

同时,不要忘记实现服务的类只是一个类。它与所有的C#类一样工作。你可以添加静态构造函数、属性、事件处理程序,实现其他接口等。


0

或许像velocity这样的缓存框架可以帮助你。


0
创建第二个类,并将其InstanceContextMode设置为单例模式,然后将所有昂贵的方法移动到该类中,在原始类中使用这些方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接