获取所请求客户端的IP地址(Soap消息)

时间:2009-06-08 12:24:48

标签: c# soap asmx ip-address

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

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

我习惯了

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

但是当然这里不适用,因为它不是HTML请求而是SOAP请求

在ALL_HTTP标题中

我得到了所有这些信息:

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?

请注意,我还没有使用任何类型的身份验证......:)

1 个答案:

答案 0 :(得分:2)

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


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

我似乎记得读过TCP / IP协议的设计者故意清楚地表明IP地址不能用作计算机的唯一标识符。不幸的是,似乎很少有人读过这篇文章。