Hi Kate,
How can I get IP address of client, which sends request to server via .net
remoting?
to be honest, I just have a piece of code, but haven't had the time to
figure out how to properly use it. But that's all I found when looking
for an answer for your question.
Cheers,
Udo
Here's the code:
class ClientIPInjecto rSink : BaseChannelObje ctWithPropertie s,
IServerChannelS ink
{
private IServerChannelS ink nextSink;
public ClientIPInjecto rSink(IServerCh annelSink nextSink)
{
this.nextSink = nextSink;
}
#region IServerChannelS ink Members
public Stream GetResponseStre am(IServerRespo nseChannelSinkS tack
sinkStack, object state, IMessage msg, ITransportHeade rs headers)
{
return null;
}
public ServerProcessin g ProcessMessage( IServerChannelS inkStack
sinkStack, IMessage requestMsg, ITransportHeade rs requestHeaders, Stream
requestStream, out IMessage responseMsg, out ITransportHeade rs
responseHeaders , out Stream responseStream)
{
//get the client's ip address, and put it in the call context. This
value will be
//extracted later so we can determine the actual address of the client.
try
{
IPAddress ipAddr =
(IPAddress)requ estHeaders[CommonTransport Keys.IPAddress];
CallContext.Set Data("ClientIP" , ipAddr);
}
catch (Exception)
{
//do nothing
}
//pushing onto stack and forwarding the call
sinkStack.Push( this, null);
ServerProcessin g srvProc = nextSink.Proces sMessage(sinkSt ack,
requestMsg, requestHeaders, requestStream, out responseMsg, out
responseHeaders , out responseStream) ;
if (srvProc == ServerProcessin g.Complete)
{
// TODO: - implement post processing
}
return srvProc;
}
public void AsyncProcessRes ponse(IServerRe sponseChannelSi nkStack
sinkStack, object state, IMessage msg, ITransportHeade rs headers, Stream
stream)
{
// get the client's ip address, and put it in the call context.
This value will be
// extracted later so we can determine the actual address of the
client.
try
{
IPAddress ipAddr = (IPAddress)head ers[CommonTransport Keys.IPAddress];
CallContext.Set Data("ClientIP" , ipAddr);
}
catch (Exception)
{
//do nothing
}
//forward to stack for further processing
sinkStack.Async ProcessResponse (msg, headers, stream);
}
public IServerChannelS ink NextChannelSink
{
get { return nextSink; }
}
#endregion
}
class ClientIPInjecto rSinkProvider : IServerChannelS inkProvider
{
private IServerChannelS inkProvider nextProvider;
#region IServerChannelS inkProvider Members
public IServerChannelS ink CreateSink(ICha nnelReceiver channel)
{
//create other sinks in the chain
IServerChannelS ink nextSink = nextProvider.Cr eateSink(channe l);
return new ClientIPInjecto rSink(nextSink) ;
}
public IServerChannelS inkProvider Next
{
get { return nextProvider; }
set { nextProvider = value; }
}
public void GetChannelData( IChannelDataSto re channelData)
{
//not needed
}
#endregion
}