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;
}
}
}
}
使用下面的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 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;
}
}
}