我在服务器侧想获知连接服务器的客户端的IP地址,以校验其身份,不知如何实现?

解决方案 »

  1.   

    string ipAddress = System.Web.HttpContext.Current.Request.UserHostAddress
      

  2.   

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

  3.   

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

  4.   

    使用方法见我在
    http://community.csdn.net/Expert/topic/5054/5054452.xml?temp=.6051294
    中的描述
      

  5.   

    ip地址可以手工改,还是获取mac地址比较好