获取WCF的客户端IP地址,post操作

获取WCF的客户端IP地址,post操作,wcf,client,ip-address,webinvoke,Wcf,Client,Ip Address,Webinvoke,我正试图通过此链接确定客户端的IP地址: 在.NET3.0中,没有可靠的方法获取 连接到WCF服务的客户端。在.NET3.5中,创建了一个新属性 引入了名为RemoteEndpointMessageProperty的属性。此属性提供 您可以输入客户端连接进入的IP地址和端口 服务于。获取这些信息是非常直接的。 只需从当前的IncomingMessageProperties中提取它 RemoteEndpointMessageProperty.Name和access指定的OperationConte

我正试图通过此链接确定客户端的IP地址:

在.NET3.0中,没有可靠的方法获取 连接到WCF服务的客户端。在.NET3.5中,创建了一个新属性 引入了名为RemoteEndpointMessageProperty的属性。此属性提供 您可以输入客户端连接进入的IP地址和端口 服务于。获取这些信息是非常直接的。 只需从当前的IncomingMessageProperties中提取它 RemoteEndpointMessageProperty.Name和access指定的OperationContext 地址和端口属性

注意事项:

  • 此属性仅适用于http和tcp传输。在所有其他方面 在诸如MSMQ和NamedPipes之类的传输中,将不使用此属性 可用
  • 地址和端口由套接字或http.sys报告 服务的机器。因此,如果客户端通过VPN或其他方式进入 修改地址的其他代理,则新地址将 表示而不是客户端的本地地址。这是可取的 而且很重要,因为这是服务的地址和端口 将客户机视为,而不是客户机将自己视为。这也意味着 可能会有一些欺骗。客户或公司里的什么人 客户端和服务器之间可能会伪造地址。所以,不要使用 任何安全决策的地址或端口,除非添加一些 其他自定义检查机制
  • 如果您在计算机上使用双工 服务,则服务不仅会填充此属性 对于客户端,但客户端也将填充此属性 对于来自该服务的每个呼叫的服务
  • 我有WebInvoke/Post和WebGet的操作合同。当客户机请求是WebGet时,该代码起作用。但是当客户端请求是WebInvoke时,我将获得WCF主机IP。有解决办法吗?谢谢

    这里是界面

    [OperationContract]
    [WebGet(UriTemplate = RestTemplate.hello_get)]
    Stream hello_get();
    
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = RestTemplate.hello_post)]
    Stream hello_post();
    
    // Code for getting IP
    private string getClientIP()
    {
        //WebOperationContext webContext = WebOperationContext.Current;
    
        OperationContext context = OperationContext.Current;
    
        MessageProperties messageProperties = context.IncomingMessageProperties;
    
        RemoteEndpointMessageProperty endpointProperty =
    
        messageProperties[RemoteEndpointMessageProperty.Name]
    
        as RemoteEndpointMessageProperty;
        return endpointProperty.Address;
    }
    
    public Stream hello_get()
    {
        string ip = getClientIP();
        ...
    }
    
    public Stream hello_post()
    {
        string ip = getClientIP();
        ...
    } 
    

    您是否尝试过使用HttpContext?并非在所有WCF模式下都可用,但这可能会根据您的环境而起作用:

    if (HttpContext.Current != null)
                {
                    Trace.WriteLine(
                        "Who's calling? IP address: '{0}', Name: '{1}', User Agent: '{2}', URL: '{3}'.",
                        HttpContext.Current.Request.UserHostAddress, HttpContext.Current.Request.UserHostName,
                        HttpContext.Current.Request.UserAgent, HttpContext.Current.Request.Url);
                }
    

    你可能想展示你尝试过但没有成功的东西。我同意詹姆斯的观点。我不明白为什么这对WebInvoke不起作用。你能提供一些代码(和配置)让我们知道你是如何处理的吗?谢谢。我已经添加了一些如上所示的代码。如果这不起作用,您应该创建一个简单的示例,复制这个问题,并将其发布到Microsoft Connect。对我来说,这是一个bug,因为没有理由认为GET应该工作而POST不工作。链接已经死了,所以很难引用代码现在应该做什么。
    if (HttpContext.Current != null)
                {
                    Trace.WriteLine(
                        "Who's calling? IP address: '{0}', Name: '{1}', User Agent: '{2}', URL: '{3}'.",
                        HttpContext.Current.Request.UserHostAddress, HttpContext.Current.Request.UserHostName,
                        HttpContext.Current.Request.UserAgent, HttpContext.Current.Request.Url);
                }