none
实现了IDuplexChannel的自定义TransportBinding后,如果有多个客户端连接,服务端callback始终回调到第一个连上的客户端 RRS feed

  • 问题

  • 我自定义了一个TCP传输双工通道IDuplexChannel,并且自定义了消息编码器,传输时不使用任何wcf默认消息编码,全是自定义二进制数据,服务端在一个客户端连接时没有任何问题,可以正常应答及回调,但当有多个客户端连接后,服务器能正常接收多个客户端发送的数据,但是用OperationContext.Current.GetCallbackChannel进行回调时,不管是在哪个客户端调用里都只能得到第一个客户端回调channel,也就是都只能callback到第一个客户端实例上,请问这应该怎么解决?

    还有,如果我想在服务端主动对客户端进行回调应该怎么做?也就是客户端还没对服务端进行调用只是成功连接时没有OperationContext.Current的时候服务器该如何回调。我这一组自定义绑定服务器在连接时可以得到客户端连接的双工通道,怎么把这个双工通道转化为可以进行回调的ServiceChannel?

    2016年3月17日 9:59

全部回复

  • 刚才我又用IDuplexSessionChannel重新实现了同样的TCP channel,这次居然好了,我查了一下区别就是生成callback channel时Session Channel和Datagram Channel的区别,IDuplexChannel有这个问题这难道是说无session的Datagram Channel只能支持单一客户端的callback?还是说这是个WCF BUG?
    2016年3月18日 3:38
  • 你好,

    在你的服务上启用多线程试试。在你的服务方法上面加以下的代码。

    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
    

    更多的信息,请参考一下链接

    https://msdn.microsoft.com/zh-cn/library/system.servicemodel.concurrencymode(v=vs.110).aspx

    Best regards,

    Cole Wu

    2016年3月24日 9:59
  • 我是在启用了多线程的基础上做的测试,而且我的情况是我有一个CustomTcpSocketChannel 类实现了IDuplexChannel

    class CustomTcpSocketChannel : ChannelBase, IDuplexChannel
    {
    ...
    }

    然后我又实现了一个IDuplexSessionChannel 类CustomTcpSocektSessionChannel,这个类的实现仅仅继承了CustomTcpSocketChannel,并实现一个空的Session接口

        class CustomTcpSocketSessionChannel : CustomTcpSocketChannel, IDuplexSessionChannel
        {
            public IDuplexSession Session
            {
                get
                {
                    return null;
                }
            }
         }
    问题就在于我用第一个类CustomTcpSocketChannel 会发生之前所述状况,用第二个完全正常。

     
    2016年3月27日 1:45