Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法在wcf C中实现静态变量_C#_Wcf_Static - Fatal编程技术网

C# 无法在wcf C中实现静态变量

C# 无法在wcf C中实现静态变量,c#,wcf,static,C#,Wcf,Static,这是我的问题。 我正在使用wcf实现一个简单的客户端-服务器。该服务器公开了一个“sum”函数,在该函数中,客户端发送的任何值都被添加到一个全局sum中,并且该sum将返回给当时连接到该服务器的所有客户端。 这就是函数 public void AddMessage(int num) { sum = sum + num; //Go through the list of connections and call their callback funcit

这是我的问题。 我正在使用wcf实现一个简单的客户端-服务器。该服务器公开了一个“sum”函数,在该函数中,客户端发送的任何值都被添加到一个全局sum中,并且该sum将返回给当时连接到该服务器的所有客户端。 这就是函数

  public void AddMessage(int num)
    {
        sum = sum + num;
        //Go through the list of connections and call their callback funciton
        subscribers.ForEach(delegate(IMessageCallback callback)
        {
            if (((ICommunicationObject)callback).State == CommunicationState.Opened)
            {
                Console.WriteLine("Calling OnMessageAdded on callback ({0}).", callback.GetHashCode());

                callback.OnMessageAdded(sum, DateTime.Now);
            }
            else
            {
                subscribers.Remove(callback);
            }
        });

    }
这是服务器调用的回调函数

 public void OnMessageAdded(int sum, DateTime timestamp)
    {
        Console.WriteLine(sum+ ": " + timestamp.ToString("hh:mm:ss"));
    }
在这部分之前没有问题。 我现在尝试在不同的端口8001上运行客户端和服务器 客户机最初会联系监听端口8000的服务器,一旦得到总数,就更新8001上监听的服务器

下面是实现这一点的代码

  //This is the function that the SERVER will call
    public void OnMessageAdded(int sum, DateTime timestamp)
    {
        Console.WriteLine(sum + ": " + timestamp.ToString("hh:mm:ss"));
        WCFService.RCRServer.Sum=sum;
        Console.WriteLine("8001's sum " + WCFService.RCRServer.Sum);
    }
正如您所看到的,“sum”是RCRServer中的一个静态字段。这就是它的声明方式

        private static int sum =0;

    public static int Sum
    {
        get { return sum; }
        set { sum = value; }

    }
此更新也可以。当与端口8000的连接丢失时,问题开始出现,我尝试在端口8001上调用相同的服务。我预计,由于客户端不断更新端口8001上服务器的静态字段,当客户端调用此服务器8001上的函数时,旧的总和将可用。但它将重置为0,并再次开始计数。我在这里哪里出错了。任何建议都将不胜感激。
谢谢。

我认为这句话是错的:

 WCFService.RCRServer.Sum=sum;
因为它不是标准的WCF调用,而是属性调用。为了通过WCF调用链接属性,您需要使用Operation Contract属性显式地标记getter和setter,但是由于接口不能由静态构造实现,我想说实际调用的是其他东西


尝试实现一个名为UpdateSumint sum的WCF方法,该方法增加静态变量并调用该方法。

在服务中保持状态充其量是有问题的,您的工作进程和应用程序池可以根据需要回收。一个更稳定的选择是将持久总和存储在数据库中。端口8000和8001上的服务器是独立的进程吗?您需要小心变量命名,刚才您有一个名为sum的静态变量,但是,您的函数采用参数sum。您确定使用的变量正确吗?是的,8000和8001上的服务器是独立的进程。您好@Jorge,在这一行中,我实际上设置了一个静态变量。它并不意味着是一个WCF函数调用。当客户端尝试更新8001上侦听的服务器进程中的sum值时,它仍然连接到8000上侦听的服务器。您的意思是,一旦您在8000上从服务器收到sum,您就在8001上更新服务器,我以为你打算用那一行来做这件事,那么你实际上如何更新第二台服务器上的值呢?WCFService.RCRServer引用是针对监听8001的服务器的。正如你所说,更新是用这一行完成的。我仍然不明白你想说什么。客户端和服务器是同一个进程吗?也就是说,它是一个既充当客户机又充当服务器的应用程序?