2009-06-08 207 views
3

我构建了一个ASMX服务,并在处理来自ELMAH的错误日志的代码中。 我添加到数据库中的所有字段,我添加更多,一个是请求的客户端的IP地址...获取请求客户端的IP地址(Soap消息)

但我不能(请阅读,不知道如何)得到的。 ..

我已经习惯了

string ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; 
if (ipAddress == "") ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 

不过关,当然这里并不适用,因为它不是一个HTML请求,但在ALL_HTTP头SOAP请求

我得到的所有信息:

HTTP_CONNECTION:Keep-Alive 
HTTP_CONTENT_LENGTH:440331 
HTTP_CONTENT_TYPE:text/xml; charset=utf-8 
HTTP_EXPECT:100-continue 
HTTP_HOST:www.mydomainname.com 
HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3074) 
HTTP_VSDEBUGGERCAUSALITYDATA:uIDPowJ7s0UYlmhEqcDjxYQT/TQAAAAADlaOOkJ5DUizA7gKLg3YEPur8pFWlaVFmpinSAOBTuIACQAA 
HTTP_SOAPACTION:"http://www. mydomainname.com/webservices/ErrorReportService/ReportErrors" 

我在哪里以及如何获得请求的IP?

请注意,我没有使用任何形式的认证(还)的... :)

回答

2

您应该能够使用HttpContext.Current.Request.UserHostAddress,但是这不会是可靠的,如果请求机器位于代理服务器或NAT设备之后。您将获得代理服务器的地址。


我想说清楚 - IP地址不是一个合适的唯一标识符。它不识别计算机。它至多可以识别特定计算机上某个特定网络接口在特定时间使用的网络层地址。在不同的时间,同一个网络接口可能使用不同的IP地址。在不同的时间点,同一台计算机可能有多个网络接口。你无法分辨。

我似乎记得读到TCP/IP协议的设计者故意明确指出,IP地址不能用作计算机的唯一标识符。不幸的是,似乎很少有人阅读过。

+0

在这些情况下,您唯一可以接受的做法是让代理在一个商定的自定义标题上转发真实IP。一切都取决于你是否有控制权。 – annakata 2009-06-08 13:18:45