Wcf双工服务重置内部呼叫的静态数据



因此,我只学习了几天wcf服务,特别是双工服务,我正在从一个测试应用程序开始。目标是拥有一个服务,它有一个存储变量的内部(静态?)类,以及一个为这些变量获取的客户端。

目前,我在Storage类中有两个变量,一个是订阅服务器列表(ObservableCollection<IMyContractCallBack>),另一个是ObservableCollection<string>,其中每个字符串都以回调方法发送到客户端。

我希望能够让客户端Fetch(如果还没有的话,它首先订阅,通过将其上下文添加到服务器端的集合)拥有服务器端集合中的字符串。那部分工作正常。但是,我也想将Push字符串从服务器发送到订阅列表中的每个客户端,以及将Add字符串发送到字符串集合。这就是我的问题突然出现的地方。

每当我Fetch时,它都会添加到字符串列表"test1…"one_answers"test2…"中并发送它们,然后客户端会更新文本块UI(wpa),所以如果我提取两次,我就会得到"test1...","test2...","test1...","test2...",因为现在没有检查重复项。这证明了从FetchFetch,集合可以在服务器端得到更新和记忆。然而,当我尝试AddSend给定的文本时,所有变量都会被遗忘,因此订阅者列表为空,要添加到的列表为空。然而,当我再次Fetch时,旧的列表又回来了(现在有6件事,test1...,test2... etc...

我在上课前有这个

[ServiceBehavior(InstanceContextMode= InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Single)]

我还尝试了Singleton上下文模式,但没有成功。将ConcurrencyMode更改为Multiple也没有任何不同。为什么只有当内部命令来自服务器本身时,我的静态数据才会重置?

这是我的服务代码:

namespace WcfService3
{   
[ServiceBehavior(InstanceContextMode= InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)]
public class Service1 : IService1
{
    public static event Action NullContext;
    public static ObservableCollection<IMyContractCallBack> Subscriptions;
    public void     NormalFunction()
    {
        //Only sends to Subs that are STILL Open
        foreach (IMyContractCallBack user in Subscriptions)
        {
            //Removes the Closed users, because they are hanging around from last session
            if (((ICommunicationObject)user).State != CommunicationState.Opened)
            {
                Subscriptions.Remove(user);
            }
            else
            {
                ObservableCollection<string> holder = Storage.GetList();
                foreach (string str in holder)
                {
                    user.CallBackFunction(str);
                }
            }
        }
    }
    public static void Send(string str)
    {
        try
        {
            foreach (IMyContractCallBack user in Subscriptions)
            {
                user.CallBackFunction(str);
            }
        }
        catch
        {
            //For some reason 'Subscriptions' is always null
            NullContext.Invoke();
        }
    }
    public static void Add(string str)
    {
        //For some reason 'SendList' is always null here, too
        Storage.AddToList(str);
        if (Subscriptions != null)
        {
            //For same reason 'Subscriptions' is always null
            foreach (IMyContractCallBack user in Subscriptions)
            {
                user.CallBackFunction(str);
            }
        }
    }
    public void Subscribe()
    {
        //Adds the callback client to a list of Subscribers
        IMyContractCallBack callback = OperationContext.Current.GetCallbackChannel<IMyContractCallBack>();
        if (Subscriptions == null)
        {
            Subscriptions = new ObservableCollection<IMyContractCallBack>();
        }
        if(!Subscriptions.Contains(callback))
        {
            Subscriptions.Add(callback);
        }
    }

这是我的Storage类代码:

namespace WcfService3
{
public static class Storage
{
    public static readonly ObservableCollection<string> SendList = new ObservableCollection<string>();
    public static IMyContractCallBack callback;
    public static ObservableCollection<string> GetList()
    {
        if (SendList.Count == 0)
        {
            AddToList("Test1...");
            AddToList("Test2...");
        }
        return SendList;
    }
    public static void AddToList(string str)
    {

            SendList.Add(str);
    }
}

}

如果需要,我可以提供更多的代码。

您在任何地方使用ThreadStatic属性吗?(只需快速搜索)这是一个很长的机会,可能不是你的问题。

您可能有线程问题。你的所有客户端都同时连接吗(我真的是指连续连接吗?)如果是,你的Subscribe方法中的代码会出现线程问题

   if (Subscriptions == null)
    {
        Subscriptions = new ObservableCollection<IMyContractCallBack>();
    }

您应该更好地限制对Subscriptions方法的访问,这样您就可以查看是谁修改了它以及何时修改,并使用Console语句来找出哪里出了问题。

最新更新