2

我想在将在终端服务器上运行的应用程序中为 .Net Remoting 回调打开一个 tcp 端口,其中多个并发用户将执行和运行该应用程序,并且每个用户都必须能够看到传入的回调事件消息。目前,当我尝试打开端口并在应用程序中注册通道时,我正在使用以下内容:

    private static void RegisterCallBackChannel(int callBackPort)
    {
        var clientProvider = new BinaryClientFormatterSinkProvider();
        var serverProvider = new BinaryServerFormatterSinkProvider 
                {TypeFilterLevel = TypeFilterLevel.Full};

        IDictionary props = new Hashtable();
        var chanNm = string.Format("CallBackChanPort:{0}", callBackPort);
        props["port"] = callBackPort;
        props["name"] = chanNm;
        props["typeFilterLevel"] = TypeFilterLevel.Full;

        if (ChannelServices.RegisteredChannels.Any(
            chn =>  chn is TcpChannel &&  chn.ChannelName == chanNm))
                return;
        var chan = new TcpChannel(props, clientProvider, serverProvider);
        ChannelServices.RegisterChannel(chan, true);
    }

这适用于第一个用户,但是当第二个并发用户在他的用户会话中启动应用程序时,.Net 代码 ChannelServices.RegisteredChannels 不包含第一个用户打开的频道,但当然是代码行

var chan = new TcpChannel(props, clientProvider, serverProvider);   

失败是因为您无法在同一台机器上的同一端口上打开两个通道,即使它们位于不同的用户会话中。

我该怎么做呢?即使我可以检测到特定端口是否已经打开,一个用户会话中的应用程序是否可以看到从不同用户会话创建的通道上的传入事件消息?

4

0 回答 0