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 ClientIPInjectorSink : BaseChannelObjectWithProperties,
IServerChannelSink
{
private IServerChannelSink nextSink;
public ClientIPInjectorSink(IServerChannelSink nextSink)
{
this.nextSink = nextSink;
}
#region IServerChannelSink Members
public Stream GetResponseStream(IServerResponseChannelSinkStack
sinkStack, object state, IMessage msg, ITransportHeaders headers)
{
return null;
}
public ServerProcessing ProcessMessage(IServerChannelSinkStack
sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream
requestStream, out IMessage responseMsg, out ITransportHeaders
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)requestHeaders[CommonTransportKeys.IPAddress];
CallContext.SetData("ClientIP", ipAddr);
}
catch (Exception)
{
//do nothing
}
//pushing onto stack and forwarding the call
sinkStack.Push(this, null);
ServerProcessing srvProc = nextSink.ProcessMessage(sinkStack,
requestMsg, requestHeaders, requestStream, out responseMsg, out
responseHeaders, out responseStream);
if (srvProc == ServerProcessing.Complete)
{
// TODO: - implement post processing
}
return srvProc;
}
public void AsyncProcessResponse(IServerResponseChannelSinkSta ck
sinkStack, object state, IMessage msg, ITransportHeaders 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)headers[CommonTransportKeys.IPAddress];
CallContext.SetData("ClientIP", ipAddr);
}
catch (Exception)
{
//do nothing
}
//forward to stack for further processing
sinkStack.AsyncProcessResponse(msg, headers, stream);
}
public IServerChannelSink NextChannelSink
{
get { return nextSink; }
}
#endregion
}
class ClientIPInjectorSinkProvider : IServerChannelSinkProvider
{
private IServerChannelSinkProvider nextProvider;
#region IServerChannelSinkProvider Members
public IServerChannelSink CreateSink(IChannelReceiver channel)
{
//create other sinks in the chain
IServerChannelSink nextSink = nextProvider.CreateSink(channel);
return new ClientIPInjectorSink(nextSink);
}
public IServerChannelSinkProvider Next
{
get { return nextProvider; }
set { nextProvider = value; }
}
public void GetChannelData(IChannelDataStore channelData)
{
//not needed
}
#endregion
}