调用后.net远程关闭与服务器的连接

时间:2018-08-21 03:38:51

标签: c# .net .net-remoting

我对.NET远程处理非常陌生。我们有一个MVC网站,使用TCP连接(.NET远程处理)调用Windows应用程序。有一个计时器每30秒运行一次,该计时器通过TCP进行呼叫,但完成后,连接仍保持建立状态。结果,几天后,服务器抛出异常,因为所有端口都用完了。然后,我们必须重新启动应用程序池以解决该问题。我不确定使用后如何关闭端口,以便我们可以再次使用它。该网站有很多用户。

下面是注册频道的客户端代码

        bool Registered = false;

        foreach (IChannel ic in ChannelServices.RegisteredChannels)
        {
            if (ic.ChannelName == ChannelNameRemoting)
            {
                return ic;
            }
        }

        // Channel not found yet


        IDictionary channelConfig = new Hashtable();
        channelConfig["name"] = ChannelNameRemoting;
        channelConfig["secure"] = false;

        BinaryClientFormatterSinkProvider defaultClientSink = new BinaryClientFormatterSinkProvider();

        if (remotingSinkProvider == null)
        {
            remotingSinkProvider = new CustomClientChannelSinkProvider();

            remotingSinkProvider.EncodingDecodingProviderEvent
                += new CustomClientChannelSinkProvider.EncodingDecodingProviderDelegate(remotingSinkProvider_EncodingDecodingProviderEvent);
        }

        defaultClientSink.Next = remotingSinkProvider;

        IChannel channel = new TcpChannel(channelConfig, defaultClientSink, null);

        if (!Registered)
        {
            ChannelServices.RegisterChannel(channel, false);

        }

        return channel;

下面的调用将创建一个连接,以在计时器中连接到服务器。

var connection = (testConnect)Activator.GetObject(
                                      typeof(testConnect),
                                      "tcp://" + _remotingUrl + ":" + _remotingPort + "/test/test4"
                              );

connection.FunctionCall();

enter image description here

1 个答案:

答案 0 :(得分:-1)

我想您需要取消注册频道。 请检查link

因此,最终我们创建TcpChannel的实例并将其注册到通道服务,然后最终将其返回给父方法,以便可以使用并进行调用。在具有返回通道实例的方法的文件/类中,还应该具有另一个方法来注销tcp通道,一旦完成调用,您需要调用此新方法来取消注册该通道,然后该方法将关闭连接。

public void UnregisterMyTcpChannel(TcpChannel yourChannelInstance)
{
   ChannelServices.UnregisterChannel(yourChannelInstance);
}