Hi,everybody,
I've been working on this problem for a few days,I google search lots of code,but it didn't work.
ClientIPServerSink.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Net;
using System.Runtime.Remoting.Messaging;
using System.IO;
namespace BusinessLogicModel
{
public class ClientIPServerSink : BaseChannelObjectWithProperties, IServerChannelSink, IChannelSinkBase
{
private IServerChannelSink _next;
public ClientIPServerSink(IServerChannelSink next)
{
_next = next;
}
public void AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, Object state, IMessage msg, ITransportHeaders headers, Stream stream)
{
}
public Stream GetResponseStream(IServerResponseChannelSinkStack sinkStack, Object state, IMessage msg, ITransportHeaders headers)
{
return null;
}
public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
{
if (_next != null)
{
IPAddress ip = requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;
Console.WriteLine(ip.ToString());
CallContext.SetData("ClientIPAddress", ip);
ServerProcessing spres = _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
return spres;
}
else
{
responseMsg = null;
responseHeaders = null;
responseStream = null;
return new ServerProcessing();
}
}
public IServerChannelSink NextChannelSink
{
get { return _next; }
set { _next = value; }
}
#region IServerChannelSink 成员
void IServerChannelSink.AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers, Stream stream)
{
throw new NotImplementedException();
}
Stream IServerChannelSink.GetResponseStream(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers)
{
throw new NotImplementedException();
}
IServerChannelSink IServerChannelSink.NextChannelSink
{
get { throw new NotImplementedException(); }
}
ServerProcessing IServerChannelSink.ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
{
throw new NotImplementedException();
}
#endregion
#region IChannelSinkBase 成员
System.Collections.IDictionary IChannelSinkBase.Properties
{
get { throw new NotImplementedException(); }
}
#endregion
}
}
ClientIPServerSinkProvider .cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Remoting.Channels;
using System.Collections;
namespace BusinessLogicModel
{
public class ClientIPServerSinkProvider : IServerChannelSinkProvider
{
private IServerChannelSinkProvider next = null;
public ClientIPServerSinkProvider()
{
}
public ClientIPServerSinkProvider(IDictionary properties, ICollection providerData)
{
}
public void GetChannelData(IChannelDataStore channelData)
{
}
public IServerChannelSink CreateSink(IChannelReceiver channel)
{
IServerChannelSink nextSink = null;
if (next != null)
{
nextSink = next.CreateSink(channel);
}
return new ClientIPServerSink(nextSink);
}
public IServerChannelSinkProvider Next
{
get { return next; }
set { next = value; }
}
#region IServerChannelSinkProvider 成员
IServerChannelSink IServerChannelSinkProvider.CreateSink(IChannelReceiver channel)
{
throw new NotImplementedException();
}
void IServerChannelSinkProvider.GetChannelData(IChannelDataStore channelData)
{
throw new NotImplementedException();
}
IServerChannelSinkProvider IServerChannelSinkProvider.Next
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}
#endregion
}
}
How can I use the two segments so I'm able to get client ip address?
Anyone who can help me,please tell me? Thanks in advance!