sink部分代码如下:
Public Class CClientIPInjectorSink
    Inherits BaseChannelObjectWithProperties
    Implements IServerChannelSink
    Public Function ProcessMessage(...) As System.Runtime.Remoting.Channels.ServerProcessing 
    Implements System.Runtime.Remoting.Channels.IServerChannelSink.ProcessMessage
        Try
            Dim IPAddr As IPAddress = CType(requestHeaders(CommonTransportKeys.IPAddress), IPAddress)
            Console.WriteLine(IPAddr.ToString)'打印客户端ip
            CallContext.SetData("ClientIP", IPAddr)
        Catch
        End Try
        sinkStack.Push(Me, Nothing)
        Dim srvProc As ServerProcessing = _nextSink.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, responseMsg, responseHeaders, responseStream)
        If srvProc = ServerProcessing.Complete Then
        End If
        Return srvProc
    End Function
End Class问题:
1、捕捉的客户端ip怎么与对应的客户连接对应?有没有唯一的“客户id”可对应?
2、如果有,客户端怎么获得自己的“客户id”进而获得自己连接服务器的外网ip?
程序是参考别人的,只能打印ip,我自己也不是很了解原理。

解决方案 »

  1.   

    在客户端也得到ip或者id,然后用sink放到requestHeaders里
      

  2.   

    写一个继承IClientChannelSink的类,和一个继承IClientChannelSinkProvider 接口 的类,然后再config里注册你的provider为clientchannel的一个provider,如下
    <configuration>
      <system.runtime.remoting>
        <application>
          <client>
            <wellknown 
               type="ServiceClass, ServiceClass"
               url="http://localhost:8080/RemoteObject"
             />
          </client>
          <channels>
            <channel ref="http">
              <clientProviders>
                <formatter ref="soap"/>
                <provider ref="propsetter1" username="bob" writeToConsole="false">
                </provider>
              </clientProviders>
            </channel>
          </channels>
        </application>
        <channelSinkProviders>
          <serverProviders>
            <provider 
       id="propsetter1" 
       type="ChannelSinkPropertySetterProvider1, comm" 
             />
          </serverProviders>
        </channelSinkProviders>
        <debug loadTypes="true" />
      </system.runtime.remoting>
    </configuration>
    然后在你的provider里的CreateSink里返回自定义的IClientChannelSink
    这样你就可以在IClientChannelSink的ProcessMessage方法里控制消息的头的内容了