Identifying the client during a .NET remoting invocation

转载 2013年12月02日 16:46:02

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();
    }
}

.NET Remoting 最简单示例

学习技术知识一个好的方法是先动手,再深入, 给出一个最简单的Remoting程序示例(C#)如下: Step1:创建类库(DLL)工程RemotingObjects,类Person代码如下: us...
  • kissqw
  • kissqw
  • 2014年01月21日 15:29
  • 20415

.net Remoting用TCP和HTTP区别(上)

2010年04月04日 星期日 11:08Remoting和WebService都是.Net提供的远程访问的方法,Remoting具有以下几个优点 1、Tcp通道的Remoting速度非常快 2、...
  • flywkk1218
  • flywkk1218
  • 2010年12月29日 14:58
  • 1488

简述WebService与.NET Remoting的区别及适应场合

为了能清楚地描述Web Service 和Remoting之间的区别,我打算从他们的体系结构上来说起: Web Service大体上分为5个层次: 1. Http传输信道 2. XML的数据格式 3....
  • zhoufoxcn
  • zhoufoxcn
  • 2007年06月12日 23:38
  • 4428

.Net中Remoting通信机制

Remoting通信机制 Remoting介绍 主要元素 通道类型 激活方式 对象定义 Remoting介绍 什么是Remoting,简而言之,我们可...
  • CoderJYF
  • CoderJYF
  • 2016年12月06日 17:25
  • 1545

.net Remoting的工作原理

     .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。在Remoting中是通过通道(channel)来实现两个应用程序域之间对象的通信的。      首先,...
  • hawking3000
  • hawking3000
  • 2010年06月15日 23:55
  • 3849

Remoting原理及实现

.NET Remoting是.NET平台上允许存在于不同应用程序域中的对象相互知晓对方并进行通讯的基础设施。调用对象被称为客户端,而被调用对象则被称为服务器或者服务器对象。简而言之,它就是.NET平台...
  • u012648365
  • u012648365
  • 2014年06月25日 21:43
  • 1420

[原创].NET Remoting: 如何通过Remoting实现双向通信(Bidirectional Communication)

Remoting是NET平台下比较成熟高效的分布式技术,我们习惯采用传统的远程调用的方式使用Remoting。在客户端所在的Application Domain,我们通过Proxy(Transp...
  • artech
  • artech
  • 2007年03月01日 19:32
  • 1001

.NET远程处理(Remoting)与WCF的性能对比(2)

本文承接上一篇,背景资料不再重述。 我按照我实际项目的需求,抽取其网络通讯的部分,用.NET远程处理和WCF分别实现,然后测量所耗时间,以此判断两者在我的场景中的性能。 心急的直接跳到最后,有...
  • gqqnb
  • gqqnb
  • 2012年02月08日 23:41
  • 5319

利用.net Remoting 实现文件传输

使用了System.Runtime.Remoting客户端接口类: Namespace Nail.Net.Remoting.Trans    Public Interface iTransFile  ...
  • ChampaignWolf
  • ChampaignWolf
  • 2007年11月13日 18:51
  • 2906

.net Remoting用TCP和HTTP区别(下)

2010年04月04日 星期日 11:08详细说明AAA:调用进程Activator的CreateInstance()方法。这个方法将创建方法参数指定类型的类对 象。它与前面的GetObject(...
  • flywkk1218
  • flywkk1218
  • 2010年12月29日 14:59
  • 971
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Identifying the client during a .NET remoting invocation
举报原因:
原因补充:

(最多只允许输入30个字)