2008-12-24 106 views
24

有没有办法获得WCF连接的远程IP地址?如何获取WCF远程端点的IP地址?

我猜为什么它没有内置到WCF框架中的原因是WCF可以使用非TCP/IP绑定,所以IP地址并不总是有意义的。

但是,这些信息对所有广泛使用的绑定(据我所知:BasicHttp,DualHttp,WSHttp和NetTcp)都是有意义的。

IP地址可能使用反射访问,但我宁愿找到一个文档化的方式来获取它,而不是黑客进入框架类。

我在这个问题上搜索了一下,似乎很多人都遇到了它,但没有找到一个体面的解决方案(通常的答案是to rely on the message headers,但这意味着信任客户端提供其真正的IP地址,这是如果您想记录IP地址出于安全原因,则不是一个选项)

回答

14

显然它已被添加到3.5通过RemoteEndpointMessageProperty;请参阅here

+0

该帖子称这可能是欺骗性的,但我无法弄清楚他们是在谈论经典的IP欺骗(使用syn/acks)还是他们的意思是由远程wcf应用程序提供信息。我认为这是前者,因为我们得到的地址是代理/中继地址。对此有何暗示? – Brann 2008-12-24 17:18:17

+0

对不起,不,我不知道。 – 2008-12-24 17:46:52

2

如果您在服务端并希望获取客户端IP,则必须检查OperationContext的消息属性。 外观here或h ere例如

+0

如果我没有弄错,这意味着信任的客户端(参见第一个链接的帖子的末尾:“我们不做任何形式的欺骗检测的,所以要小心使用IP的任何种类的安全决定。“) 我宁愿访问我自己的套接字并检索它连接的IP地址。 – Brann 2008-12-24 10:11:57

3
OperationContext context = OperationContext.Current; 
MessageProperties properties = context.IncomingMessageProperties; 
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
string address = endpoint.Address;