下面是我在网上找的代码但是我刚学remoting不知道怎么用?请高手指教
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 RemotingServer
{    public class ClientIPServerSinkProvider : IServerChannelSinkProvider
    {
        private IServerChannelSinkProvider next = null;
        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; }
        }
    }    public class ClientIPServerSink : BaseChannelObjectWithProperties, IServerChannelSink, IChannelSinkBase
    {        private IServerChannelSink _next;        public ClientIPServerSink(IServerChannelSink next)
        {
            _next = next;
        }        public void AsyncProcessResponse(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers, System.IO.Stream stream)
        {        }        public Stream GetResponseStream(System.Runtime.Remoting.Channels.IServerResponseChannelSinkStack sinkStack, System.Object state, System.Runtime.Remoting.Messaging.IMessage msg, System.Runtime.Remoting.Channels.ITransportHeaders headers)
        {
            return null;
        }        public System.Runtime.Remoting.Channels.ServerProcessing ProcessMessage(System.Runtime.Remoting.Channels.IServerChannelSinkStack sinkStack, System.Runtime.Remoting.Messaging.IMessage requestMsg, System.Runtime.Remoting.Channels.ITransportHeaders requestHeaders, System.IO.Stream requestStream, out System.Runtime.Remoting.Messaging.IMessage responseMsg, out System.Runtime.Remoting.Channels.ITransportHeaders responseHeaders, out System.IO.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; }        }    }}

解决方案 »

  1.   

    Remoting 体系提供了一种插件机制,也就是楼主上面两个Sink类,分别是用于客户端和服务端(必须成对使用),客户端sink通过CallContext.SetData("ClientIPAddress", ip);将IP信息放如SinkData中传递到服务端,在服务端读取相应上下文即可
      

  2.   

    To 楼主
      可以很简单得使用RemotingConfiguration.Configure()方法来载入config文件使用插入sink,这个网上的教程很多,具体可以参照Rickie Lee的文章《如何定制Sink扩展.Net Remoting功能》http://www.cnblogs.com/rickie/archive/2004/10/21/54891.html
      另外还可以自己定制tcpchannel中sinkprovider chain的生成来使用自定义的sink。
      代码如下:Client:BinaryServerFormatterSinkProvider serverProvider = 
    new BinaryServerFormatterSinkProvider();BinaryClientFormatterSinkProvider clientProvider = 
    new BinaryClientFormatterSinkProvider();serverProvider.TypeFilterLevel = TypeFilterLevel.Full;IDictionary props = new Hashtable();
    props["port"] = 0;System.Runtime.Remoting.Channels.Tcp.TcpChannel tcc = 
    new TcpChannel(props,clientProvider,serverProvider);

    System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(tcc);
    Hello h = (Hello)System.Activator.GetObject(typeof(Hello),"tcp://localhost:4400/TestRemoting");
    System.Console.WriteLine(h.SayHello());
    Server:
    BinaryServerFormatterSinkProvider serverProvider = 
    new BinaryServerFormatterSinkProvider();remotingTest.CClientIPInjectorSinkProvider IPProvider = 
    new CClientIPInjectorSinkProvider();

    IPProvider.Next = serverProvider;//链接上下一个provider
    serverProvider.TypeFilterLevel = TypeFilterLevel.Full;IDictionary props = new Hashtable();
    props["port"] = 4400;
    props["id"]=string.Empty;

    Hello h = new Hello();System.Runtime.Remoting.Channels.Tcp.TcpServerChannel tsc = 
    new TcpServerChannel(props,IPProvider);

    System.Runtime.Remoting.Channels.ChannelServices.RegisterChannel(tsc);
    ObjRef objrefWellKnown = 
    System.Runtime.Remoting.RemotingServices.Marshal(h,"TestRemoting");
    System.Console.WriteLine("回车结束服务器运行!");
    System.Console.ReadLine();=======================================
    to lxhvc
    并不一定需要成对出现,在ingo rammar的例子里面他使用了
    IPAddress IPAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
    的方法,所以,只要在服务端把这个sink插入进去就可以了。
    而CommonTransportKeys中正好含有客户端的IP地址。sink 无需成对,事实上在Client和Server端的sink chain中都不一定是成对反向排列的。
    这些都可以在ingo rammar的书里面找到例子。
      

  3.   

    http://topic.csdn.net/t/20040402/10/2916469.html