[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

microsoft.public.dotnet.framework.remoting

Cached Connections in .NET Remoting

cmagicos

9/20/2004 6:52:00 PM

Hi there,

Days ago, i ran into a serious problem. I´m using DNS round robin in a
..NET Remoting application. But, as long as the .NET Remoting makes a
sort of cache of each connection made. If you try to connect to a
server as mycomputer:3001, that is an alias to the round robin, the
..NET Remoting will cache the IP address returned from the DNS server,
and each subsequent request to the alias will be redirected to the
first ip address cached by the .NET Remoting, doing this the .NET
Remoting don´t resolve the alias to get the new ip address.
So, looking through the TcpChannels, i found out the
TcpClientTransportSink, which have a private member of the class
ClientSocketCache, which caches all the remoting connections already
made by the client into a Hashtable.
Via reflection i've accessed this hashtable and cleared it, solving my
problem.
I hope that it would be usefull.

Thiago Oliveira.

Type channelsvc = Type.GetType("System.Runtime.Remoting.Channels.ChannelServices");

object sink =
channelsvc.InvokeMember("GetChannelSinkForProxy",
BindingFlags.InvokeMethod | BindingFlags.Static |
BindingFlags.NonPublic, null, null, new object[] { proxy });
IClientChannelSink sink1 =
(IClientChannelSink)sink; // Get The BinaryFormatter Sink
IClientChannelSink sink2 = sink1.NextChannelSink;
// Get The TcpClientTransport Sink

// Iterates through the sinks 'till find the
TcpClientTransportSink
while (sink1 != null && sink1.NextChannelSink !=
null)
{
sink2 = sink1.NextChannelSink;
sink1 = sink2.NextChannelSink;
}

Type TcpClientTransportSink = sink2.GetType();

FieldInfo fClientSocketCache =
TcpClientTransportSink.GetField("ClientSocketCache",
BindingFlags.NonPublic | BindingFlags.Instance);
object ClientSocketCache =
fClientSocketCache.GetValue(sink2);

FieldInfo f_connections =
ClientSocketCache.GetType().GetField("_connections",
BindingFlags.NonPublic | BindingFlags.Static);
Hashtable _connections =
(Hashtable)f_connections.GetValue(null);

_connections.Clear();
Thread.Sleep(2000);
1 Answer

Robert Jordan

9/20/2004 7:45:00 PM

0

Hi Thiago,

> Hi there,
>
> Days ago, i ran into a serious problem. I´m using DNS round robin in a
> .NET Remoting application. But, as long as the .NET Remoting makes a
> sort of cache of each connection made. If you try to connect to a
> server as mycomputer:3001, that is an alias to the round robin, the
> .NET Remoting will cache the IP address returned from the DNS server,
> and each subsequent request to the alias will be redirected to the
> first ip address cached by the .NET Remoting, doing this the .NET
> Remoting don´t resolve the alias to get the new ip address.
> So, looking through the TcpChannels, i found out the
> TcpClientTransportSink, which have a private member of the class
> ClientSocketCache, which caches all the remoting connections already
> made by the client into a Hashtable.
> Via reflection i've accessed this hashtable and cleared it, solving my
> problem.
> I hope that it would be usefull.

Well, nice hack, but why? Are you doing DNS round robin
with *one* client and several servers?

People that need DNS round robin use to have a couple of servers
and a lot of clients. In this scenario the local cache doesn't
matter.

bye
Rob

>
> Thiago Oliveira.
>
> Type channelsvc = Type.GetType("System.Runtime.Remoting.Channels.ChannelServices");
>
> object sink =
> channelsvc.InvokeMember("GetChannelSinkForProxy",
> BindingFlags.InvokeMethod | BindingFlags.Static |
> BindingFlags.NonPublic, null, null, new object[] { proxy });
> IClientChannelSink sink1 =
> (IClientChannelSink)sink; // Get The BinaryFormatter Sink
> IClientChannelSink sink2 = sink1.NextChannelSink;
> // Get The TcpClientTransport Sink
>
> // Iterates through the sinks 'till find the
> TcpClientTransportSink
> while (sink1 != null && sink1.NextChannelSink !=
> null)
> {
> sink2 = sink1.NextChannelSink;
> sink1 = sink2.NextChannelSink;
> }
>
> Type TcpClientTransportSink = sink2.GetType();
>
> FieldInfo fClientSocketCache =
> TcpClientTransportSink.GetField("ClientSocketCache",
> BindingFlags.NonPublic | BindingFlags.Instance);
> object ClientSocketCache =
> fClientSocketCache.GetValue(sink2);
>
> FieldInfo f_connections =
> ClientSocketCache.GetType().GetField("_connections",
> BindingFlags.NonPublic | BindingFlags.Static);
> Hashtable _connections =
> (Hashtable)f_connections.GetValue(null);
>
> _connections.Clear();
> Thread.Sleep(2000);