C# WCF如何查找Ip连接/连接的客户端?

C# WCF如何查找Ip连接/连接的客户端?,c#,wcf,C#,Wcf,您好,它应该位于主机一侧,WCF必须连接事件/客户端断开连接。在这种情况下,禁用将在会话生存期之后发生 我必须识别的每个客户机(Ip地址或客户机设置中提供的特定信息并不重要,主要是要识别)。我使用端点行为的重新定义 class ClientTrackerEndpointBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterColle

您好,它应该位于主机一侧,WCF必须连接事件/客户端断开连接。在这种情况下,禁用将在会话生存期之后发生

我必须识别的每个客户机(Ip地址或客户机设置中提供的特定信息并不重要,主要是要识别)。我使用端点行为的重新定义

class ClientTrackerEndpointBehavior : IEndpointBehavior
{
    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
    {
    }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    {
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {

        endpointDispatcher.ChannelDispatcher.ChannelInitializers.Add(new ClientTrackerChannelInitializer());
    }

    public void Validate(ServiceEndpoint endpoint)
    {
    }
}
ClientTrackerChannel初始值设定项

类ClientTrackerChannel初始值设定项:IChannelInitializer
{
内部静态int ConnectedClientCount=0;
public static ISubject ClientConnectChange{get;}=new Subject();
public void Initialize(IClientChannel)/!!!!!!!我想在这里看到有关Clint的信息。
{
ConnectedClientCount++;
WriteLine(“客户端{0}已初始化”,channel.SessionId);
channel.Closed+=客户端断开连接;
channel.Faulted+=ClientDisconnected;
ClientConnectChange.OnNext(新的ClientConnectionInfo{Action=channel.State,SessionId=channel.SessionId,iPAddress=channel.LocalAddress.ToString()});
}
静态void ClientDisconnected(对象发送方,事件参数e)
{
var通道=(IClientChannel)发送方;
ConnectedClientCount--;
ClientConnectChange.OnNext(新的ClientConnectionInfo{Action=channel.State,SessionId=channel.SessionId,iPAddress=channel.LocalAddress.ToString()});
}
}
主机启动

字符串基地址=”http://192.168.1.33:4000/Service";
服务=新的ServiceHost(类型(服务),新的Uri(基地址));
//MEX端点
ServiceMetadataBehavior smb=service.Description.Behaviors.Find();
如果(smb==null)
smb=新的ServiceMetadataBehavior();
smb.HttpGetEnabled=true;
smb.MetadataExporter.PolicyVersion=PolicyVersion.Policy15;
服务.描述.行为.添加(smb);
service.AddServiceEndpoint(ServiceMetadataBehavior.MexContractName,MetadataExchangeBindings.CreateMexHttpBinding(),“mex”);
//IContract端点
WSHttpBinding=新的WSHttpBinding(SecurityMode.None,true);
binding.OpenTimeout=newtimespan(0,0,20);
binding.CloseTimeout=新的时间跨度(0,0,20);
binding.SendTimeout=新的时间跨度(0,0,5);
binding.ReceiveTimeout=新的时间跨度(0,0,25);
ServiceEndpoint=service.AddServiceEndpoint(typeof(IContract),binding,“”);
添加(新的ClientTrackerEndpointBehavior());
service.Open();
事件初始化并正确触发ClientDisconnected。但是没有关于客户机的信息,我可以从他们那里了解到不是channel.RemoteAddress==null


提前谢谢大家

您是否尝试过在触发
频道打开事件期间或之后检查
频道.RemoteAddress
?我在Initialize方法和ClientDisconnected内部进行了检查。在这两种情况下,都等于NULL channel.RemoteAddressI在方法initialize()State=Created中使用了:[servicebeavior(InstanceContextMode=InstanceContextMode.PerSession)]。在方法内部,Client Disconnected()状态=Closed。如何捕捉打开的状态?我处理事件通道。打开+=通道打开;它也等于NULL channel.RemoteAddress您是否尝试在
通道期间或之后检查
通道.RemoteAddress
。已触发打开事件?我在Initialize方法内部进行了检查,并断开了ClientDisconnected。在这两种情况下,都等于NULL channel.RemoteAddressI在方法initialize()State=Created中使用了:[servicebeavior(InstanceContextMode=InstanceContextMode.PerSession)]。在方法内部,Client Disconnected()状态=Closed。如何捕捉打开的状态?我处理事件通道。打开+=通道打开;它还等于NULL channel.RemoteAddress
  class ClientTrackerChannelInitializer : IChannelInitializer
    {

    internal static int ConnectedClientCount = 0;
public static ISubject<ClientConnectionInfo> ClientConnectChange { get; } = new Subject<ClientConnectionInfo>();


        public void Initialize(IClientChannel channel) //!!!!!!!I would like to see here about the Clint.
        {
            ConnectedClientCount++;
            Console.WriteLine("Client {0} initialized", channel.SessionId);
            channel.Closed += ClientDisconnected;
            channel.Faulted += ClientDisconnected;

            ClientConnectChange.OnNext(new ClientConnectionInfo { Action = channel.State, SessionId = channel.SessionId, IpAdress = channel.LocalAddress.ToString()});
        }
        static void ClientDisconnected(object sender, EventArgs e)
        {
            var channel = (IClientChannel) sender;
            ConnectedClientCount--;
            ClientConnectChange.OnNext(new ClientConnectionInfo { Action = channel.State, SessionId = channel.SessionId, IpAdress = channel.LocalAddress.ToString() });
        }
    }
            string baseAddress = "http://192.168.1.33:4000/Service";
            service = new ServiceHost(typeof(Service), new Uri(baseAddress));

            //MEX EndPoint
            ServiceMetadataBehavior smb = service.Description.Behaviors.Find<ServiceMetadataBehavior>();
            if (smb == null)
                smb = new ServiceMetadataBehavior();
            smb.HttpGetEnabled = true;
            smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
            service.Description.Behaviors.Add(smb);
            service.AddServiceEndpoint( ServiceMetadataBehavior.MexContractName,   MetadataExchangeBindings.CreateMexHttpBinding(),"mex");

            //IContract EndPoint
            WSHttpBinding binding = new WSHttpBinding(SecurityMode.None, true);
            binding.OpenTimeout = new TimeSpan(0, 0, 20);
            binding.CloseTimeout = new TimeSpan(0, 0, 20);
            binding.SendTimeout = new TimeSpan(0, 0, 5);      
            binding.ReceiveTimeout = new TimeSpan(0, 0, 25);  
            ServiceEndpoint endpoint = service.AddServiceEndpoint(typeof(IContract), binding, "");
            endpoint.Behaviors.Add(new ClientTrackerEndpointBehavior());

            service.Open();