3

我构建了一个 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?

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

4

1 回答 1

2

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


我想说清楚 - IP 地址不是适当的唯一标识符。它不能识别计算机。充其量,它标识了一台特定计算机上的一个特定网络接口在特定时间使用的网络层地址。在不同的时间,同一个网络接口可能使用不同的 IP 地址。在不同的时间点,同一台计算机可能有多个网络接口。你就是说不出来。

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

于 2009-06-08T13:08:56.863 回答