none
Wcf双工,一台机器上多个client.应该如何配置? RRS feed

  • 问题

  • 可以这样理解,做的一个东西和QQ差不多,一台机器上可能不止一个client.

     

    下面这段代码是host对用户登陆保存callback.通过测试,我一台机器上开两个client登陆之后callbackDic里面只有一个client保存

    private Dictionary<long, IServiceCallback> callBackDic = new Dictionary<long, IServiceCallback>();
            public User Login(string username, string password)
            {
                Console.WriteLine(username);
                User user = BLL.UserBLL.Login(username, password);
                Console.WriteLine((user != null).ToString());
                if (user != null)
                {
                    if (callBackDic.Select(c => c.Key == user.UID).Count() != 0)
                    {
                        callBackDic.Remove(user.UID);
                        Console.WriteLine(user.Username + " has been removed!");
                    }
                    callBackDic.Add(user.UID, OperationContext.Current.GetCallbackChannel<IServiceCallback>());
                    Console.WriteLine(user.Username + " has login!");
                    Console.WriteLine("There is " + callBackDic.Count + " clients in callDic");
                }
                return user;
            }
    
     我猜测的是客户端的配置有问题.下面是我的客户端的配置.
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
          <bindings>
            <netTcpBinding>
              <binding name="netTcpBindConfig"  closeTimeout="00:30:00"
                      openTimeout="00:30:00" receiveTimeout="00:30:00" sendTimeout="00:30:00"
                      transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
                      hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                      maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="10"
                      maxReceivedMessageSize="2147483647">
                <readerQuotas maxDepth="2147483647"
                                          maxStringContentLength="2147483647"
                                          maxArrayLength="2147483647"
                                          maxBytesPerRead="2147483647"
                                          maxNameTableCharCount="2147483647" />
                <reliableSession ordered="true"  inactivityTimeout="00:01:00" enabled="false" />
                <security mode="None">
                  <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"  />
                  <message clientCredentialType="Windows"  />
                </security>
              </binding>
            </netTcpBinding>
          </bindings>
          <client>
              <endpoint address="net.tcp://192.168.1.2:1234/IMService" binding="netTcpBinding"
                  bindingConfiguration="netTcpBindConfig" contract="IMService.IService"
                  name="NetTcpBinding_IService" />
          </client>
        </system.serviceModel>
    </configuration>
    
    请问下这样的问题该如何解决.
    2011年11月20日 6:27

答案

全部回复

  • 问题解决了...private Dictionary<long, IServiceCallback> callBackDic = new Dictionary<long, IServiceCallback>(); 必须是一个static对象才可以.

     

    请问下为什么?谁能解答下.

    2011年11月20日 10:53
  • 问题解决了...private Dictionary<long, IServiceCallback> callBackDic = new Dictionary<long, IServiceCallback>(); 必须是一个static对象才可以.

     

    请问下为什么?谁能解答下.

    如果不是非静态成员,每个客户端调用都有自己的服务实例,也就无法共享数据,采用Static声明的话,保证了两个服务实例共享一个属性callBackDic。另外还要注意多线程访问同一个资源的互斥问题。
    Frank Xu Lei--谦卑若愚,好学若饥
    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    • 已标记为答案 cn.Alex.su 2011年11月21日 5:06
    2011年11月21日 1:45
    版主