Identifying the client during a .NET remoting invocation

http://stackoverflow.com/questions/527676/identifying-the-client-during-a-net-remoting-invocation/527756#527756


One of the things you can do is identify a client by IP address by implementing anIServerChannelSinkProvider.

Add this class to your remoting host project:

ClientIPServerSinkProvider.cs

using System;
using System.Collections;
using System.IO;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Messaging;
using System.Runtime.Remoting.Channels;
using System.Threading;
using System.Net;

namespace MyRemotingEnvironment
{
    public class ClientIPServerSinkProvider : 
    	IServerChannelSinkProvider
    {
    	private IServerChannelSinkProvider _nextProvider = null;

    	public ClientIPServerSinkProvider()
    	{
    	}

    	public ClientIPServerSinkProvider(
    		IDictionary properties, 
    		ICollection providerData)
    	{
    	}

    	public IServerChannelSinkProvider Next
    	{
    		get { return _nextProvider; }
    		set { _nextProvider = value; }
    	}

    	public IServerChannelSink CreateSink(IChannelReceiver channel)
    	{
    		IServerChannelSink nextSink = null;

    		if (_nextProvider != null)
    		{
    			nextSink = _nextProvider.CreateSink(channel);
    		}
    		return new ClientIPServerSink(nextSink);
    	}

    	public void GetChannelData(IChannelDataStore channelData)
    	{
    	}
    }



    public class ClientIPServerSink : 
    	BaseChannelObjectWithProperties, 
    	IServerChannelSink, 
    	IChannelSinkBase
    {

    	private IServerChannelSink _nextSink;

    	public ClientIPServerSink(IServerChannelSink next)
    	{
    		_nextSink = next;
    	}

    	public IServerChannelSink NextChannelSink
    	{
    		get { return _nextSink; }
    		set { _nextSink = value; }
    	}

    	public void AsyncProcessResponse(
    		IServerResponseChannelSinkStack sinkStack, 
    		Object state, 
    		IMessage message, 
    		ITransportHeaders headers, 
    		Stream stream)
    	{
    		IPAddress ip = headers[CommonTransportKeys.IPAddress] as IPAddress;
    		CallContext.SetData("ClientIPAddress", ip);
    		sinkStack.AsyncProcessResponse(message, headers, stream);
    	}

    	public Stream GetResponseStream(
    		IServerResponseChannelSinkStack sinkStack, 
    		Object state, 
    		IMessage message, 
    		ITransportHeaders headers)
    	{

    		return null;

    	}


    	public ServerProcessing ProcessMessage(
    		IServerChannelSinkStack sinkStack, 
    		IMessage requestMsg, 
    		ITransportHeaders requestHeaders, 
    		Stream requestStream, 
    		out IMessage responseMsg, 
    		out ITransportHeaders responseHeaders, 
    		out Stream responseStream)
    	{
    		if (_nextSink != null)
    		{
    			IPAddress ip = 
    				requestHeaders[CommonTransportKeys.IPAddress] as IPAddress;
    			CallContext.SetData("ClientIPAddress", ip);
    			ServerProcessing spres = _nextSink.ProcessMessage(
    				sinkStack, 
    				requestMsg, 
    				requestHeaders, 
    				requestStream, 
    				out responseMsg, 
    				out responseHeaders, 
    				out responseStream);
    			return spres;
    		}
    		else
    		{
    			responseMsg = null;
    			responseHeaders = null;
    			responseStream = null;
    			return new ServerProcessing();
    		}
    	}


    }
}
Then when you start your remoting host do something like the following:

BinaryServerFormatterSinkProvider bp = new BinaryServerFormatterSinkProvider();
ClientIPServerSinkProvider csp = new ClientIPServerSinkProvider();
csp.Next = bp;
Hashtable ht = new Hashtable();
ht.Add("port", "1234"); // Your remoting port number
TcpChannel channel = new TcpChannel(ht, null, csp);
ChannelServices.RegisterChannel(channel, false);

RemotingConfiguration.RegisterWellKnownServiceType(
    typeof(MyRemotedClass), 
    "MyRemotedClass.rem", 
    WellKnownObjectMode.SingleCall);

In your method calls you can access the IP address of the client by doing:

public class MyRemotedClass : MarshalByref
{
    public void DoThis()
    {
    	string clientIP = CallContext.GetData("ClientIPAddress").ToString();
    }
}

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值