我对.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();
答案 0 :(得分:-1)
我想您需要取消注册频道。 请检查link
因此,最终我们创建TcpChannel
的实例并将其注册到通道服务,然后最终将其返回给父方法,以便可以使用并进行调用。在具有返回通道实例的方法的文件/类中,还应该具有另一个方法来注销tcp通道,一旦完成调用,您需要调用此新方法来取消注册该通道,然后该方法将关闭连接。
public void UnregisterMyTcpChannel(TcpChannel yourChannelInstance)
{
ChannelServices.UnregisterChannel(yourChannelInstance);
}