2017-08-28 43 views
2

TWebRequest有两种方法An Iteraitve对retrive客户端IP地址:德尔福Web.HTTPApp.TWebRequest REMOTEIP VS RemoteAddr

  1. REMOTEIP
  2. RemoteAddr

docs of RemoteIP

指定远程目标机器的IP与HTTP相关联10请求消息。阅读RemoteIP属性以获取与HTTP请求消息关联的远程目标机器的IP地址 。

docs of RemoteAddr

指示与HTTP 请求消息相关联的客户端的远程IP地址。读取RemoteAddr以获取Web客户端请求源 的IP地址。

它们看起来非常接近,但RemoteIP返回一个空字符串。 我想检索客户端的IP地址,什么是正确的方法?

+2

有趣的是,RemoteIP [没有出现在属性列表中](http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/!!MEMBEROVERVIEW_HTTPApp_TWebRequest.html)。也许这是他们打算在某个时候实现的东西,或者那只是因为它必须符合一些祖先的接口或抽象方法。看来RemoteIP没有真正的目的,你应该使用RemoteAddr。 – GolezTrol

回答

3

如果我们看看源代码,我们会发现在TWebRequest

声明
property RemoteIP: string read GetRemoteIP; 
property RemoteAddr: string index 21 read GetStringVariable; 

以下实现:

function TWebRequest.GetRemoteIP: string; 
begin 
    Result := EmptyStr; 
end; 

和GetStringVariable是一个虚拟的方法。

让我们来看看子类之一 - TISAPIRequest,我们会发现如下:

LResult := GetFieldByNameA(ServerVariables[Index]); 

ServerVariables [21]为 'REMOTE_ADDR' 标题,这表明客户端或代理服务器的IP。

但是没有GetRemoteIP的实现。

它看起来像RemoteIP没有在请求中使用,因为TCGIRequest,TApacheRequest和TWinCGIRequest也不实现GetRemoteIP。