使用下面的sinkprovider类和sink类。 sing System; using System.Runtime.Remoting.Channels; using System.Net; using System.Runtime.Remoting.Messaging; using System.Collections; using System.IO;namespace remotingTest { public class CClientIPInjectorSink : BaseChannelObjectWithProperties,IServerChannelSink { private IServerChannelSink _nextSink;
public CClientIPInjectorSink(IServerChannelSink nextSink) { _nextSink = nextSink; }
public void AsyncProcessResponse(IServerResponseChannelSinkStack 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]; //==================================== Console.WriteLine(IPAddr.ToString()); //==================================== CallContext.SetData("ClientIP", IPAddr); } catch{} //forward to stack for further processing sinkStack.AsyncProcessResponse(msg, headers,stream); } public Stream GetResponseStream(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers) { return null; } public IServerChannelSink NextChannelSink { get { return _nextSink; } } 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]; //=================================== Console.WriteLine(IPAddr.ToString()); CallContext.SetData("ClientIP", IPAddr); } catch{} //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; } } }
using System; using System.Runtime.Remoting.Channels; using System.Net; using System.Runtime.Remoting.Messaging; using System.Collections; using System.IO;namespace remotingTest { public class CClientIPInjectorSinkProvider : IServerChannelSinkProvider { private IServerChannelSinkProvider _nextProvider; public CClientIPInjectorSinkProvider(){} public CClientIPInjectorSinkProvider(IDictionary properties, ICollection providerdata){} public IServerChannelSink CreateSink(IChannelReceiver channel) { //create other sinks in the chain IServerChannelSink nextSink = _nextProvider.CreateSink(channel); return new CClientIPInjectorSink(nextSink); } public void GetChannelData(IChannelDataStore channelData) { //not needed } public IServerChannelSinkProvider Next { get { return _nextProvider; } set { _nextProvider = value; } } } }
sing System;
using System.Runtime.Remoting.Channels;
using System.Net;
using System.Runtime.Remoting.Messaging;
using System.Collections;
using System.IO;namespace remotingTest
{ public class CClientIPInjectorSink : BaseChannelObjectWithProperties,IServerChannelSink
{
private IServerChannelSink _nextSink;
public CClientIPInjectorSink(IServerChannelSink nextSink)
{
_nextSink = nextSink;
}
public void AsyncProcessResponse(IServerResponseChannelSinkStack 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];
//====================================
Console.WriteLine(IPAddr.ToString());
//====================================
CallContext.SetData("ClientIP", IPAddr);
}
catch{} //forward to stack for further processing
sinkStack.AsyncProcessResponse(msg, headers,stream);
} public Stream GetResponseStream(IServerResponseChannelSinkStack sinkStack,
object state,
IMessage msg,
ITransportHeaders headers)
{
return null;
} public IServerChannelSink NextChannelSink
{
get
{
return _nextSink;
}
} 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];
//===================================
Console.WriteLine(IPAddr.ToString());
CallContext.SetData("ClientIP", IPAddr);
}
catch{} //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;
}
}
}
using System.Runtime.Remoting.Channels;
using System.Net;
using System.Runtime.Remoting.Messaging;
using System.Collections;
using System.IO;namespace remotingTest
{ public class CClientIPInjectorSinkProvider : IServerChannelSinkProvider
{ private IServerChannelSinkProvider _nextProvider; public CClientIPInjectorSinkProvider(){} public CClientIPInjectorSinkProvider(IDictionary properties,
ICollection providerdata){} public IServerChannelSink CreateSink(IChannelReceiver channel)
{
//create other sinks in the chain
IServerChannelSink nextSink = _nextProvider.CreateSink(channel);
return new CClientIPInjectorSink(nextSink);
}
public void GetChannelData(IChannelDataStore channelData)
{
//not needed
} public IServerChannelSinkProvider Next
{
get
{
return _nextProvider;
}
set
{
_nextProvider = value;
}
}
}
}
http://community.csdn.net/Expert/topic/5054/5054452.xml?temp=.6051294
中的描述