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

时间:2010-08-27 00:13:41

标签: wcf client ip-address webinvoke

我正在尝试通过此链接确定客户端的IP地址:http://www.danrigsby.com/blog/index.php/2008/05/21/get-the-clients-address-in-wcf/

  

在.Net 3.0中,没有一种可靠的方法来获取地址   客户端连接到WCF服务。在.Net 3.5中有一个新的属性   介绍名为RemoteEndpointMessageProperty。这个属性给出   你是客户端连接进入的IP地址和端口   服务。获取这些信息非常简单。   只需从当前的IncomingMessageProperties中提取它   OperationContext由RemoteEndpointMessageProperty.Name和访问   地址和端口属性。

> [ServiceContract] public interface IMyService {
>     [OperationContract]
>     string GetAddressAsString(); }
> 
> public class MyService : IMyService {
>     public string GetAddressAsString()
>     {
>         RemoteEndpointMessageProperty clientEndpoint =
>             OperationContext.Current.IncomingMessageProperties[
>             RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
> 
>         return String.Format(
>             "{0}:{1}",
>             clientEndpoint.Address, clientEndpoint.Port);
>     } } 
  

注意事项:

     
      
  1. 此属性仅适用于http和tcp传输。在所有其他   像MSMQ和NamedPipes这样的传输,这个属性不会   可用。
  2.   
  3. 地址和端口由套接字或http.sys报告   服务的机器。因此,如果客户端通过VPN或某些进入   修改地址的其他代理,即新地址   代表客户端的本地地址。这是可取的   并且重要因为这是服务的地址和端口   将客户视为,而不是客户认为自己。这也意味着   可能会有一些欺骗行为。客户或某事   客户端和服务器之间可能会欺骗一个地址。所以,不要使用   任何安全决策的地址或端口,除非你添加一些   其他自定义检查机制。
  4.   
  5. 如果您正在使用双面打印   服务,那么服务不仅会填充此属性   对于客户端,但客户端也将填充此属性   用于该服务的每次通话的服务。
  6.   

我有WebInvoke / Post和WebGet的operationContracts。当客户端请求是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();
    ...
} 

1 个答案:

答案 0 :(得分:-1)

您是否尝试过使用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);
            }