在 WCF 3.0 中获取客户端 IP 地址

Posted

技术标签:

【中文标题】在 WCF 3.0 中获取客户端 IP 地址【英文标题】:Obtaining client IP address in WCF 3.0 【发布时间】:2010-09-10 17:25:34 【问题描述】:

显然,您可以在 WCF 3.5 中轻松获取客户端 IP 地址,但在 WCF 3.0 中则不行。有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

这在 3.0 中对您没有帮助,但我只能看到人们发现这个问题并感到沮丧,因为他们试图在 3.5 中获取客户端 IP 地址。所以,这里有一些应该可以工作的代码:

using System.ServiceModel;
using System.ServiceModel.Channels;

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
    prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

【讨论】:

我无法编辑帖子,但它帮助了我很多,谢谢!想提一下有2个错误。应该是“OperationContext”而不是“OperationContent”,应该是“RemoteEndpointMessageProperty”而不是“RemoveEndpointMessageProperty”。 安全说明:这个值可以被欺骗...见 MSDN @makerofthings7 我在 MSDN 上看到过,但它真的会被欺骗吗?请求仍然有 TCP 握手。如果 IP 真的被欺骗了,syn ack 不会被发送到错误的地方,因此连接会在开始之前就失败吗? @cost 本例中的“IP”不仅在 TCP 数据包中,而且还驻留在 WCF 消息中,但是数据流(第 7 层)中的此文本没有得到适当的保护' @shambulator 我看到这个问题已经好几年了,但下面的知识库文章似乎表明它可能是端口,而不是 IP 地址。 support.microsoft.com/kb/971842【参考方案2】:

事实证明您可以,只要 (a) 您的服务托管在 Web 服务中(显然)并且 (b) 您启用 AspNetCompatibility 模式,如下所示:

    <system.serviceModel>
            <!-- this enables WCF services to access ASP.Net http context -->
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...
    </system.serviceModel>

然后你可以通过以下方式获取IP地址:

HttpContext.Current.Request.UserHostAddress

【讨论】:

然后使用HttpContext.Current.Request.UserHostAddress得到它 请注意这会引发一系列问题【参考方案3】:

如果您的目标是 .NET 3.0 SP1,则可以。

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

学分: http://blogs.msdn.com/phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx

参考: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx

【讨论】:

好的,我看起来像得到一个像“fe80::3dbc:a2ec”这样的 IPv6。我在徘徊如何获得远程IP号 @makerofthings7 在做出安全决策时我们应该使用什么?

以上是关于在 WCF 3.0 中获取客户端 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

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

在负载平衡情况下使用 WCF 4.5 RemoteEndpointMessageProperty 获取客户端 IP 地址

wcf客户端怎么获取自身使用的端口号?

WCF 客户端到 WSE 3.0 服务异常:CWWSS7310E:XML 加密信息 [.....]

[转]使用代码去描述WCF配置文件

如何获取 WCF 远程端点的 IP 地址?