我的公司有多种软件产品,它们能够记录IP地址。每种产品的操作方式都不同,可以通过HttpContext.Request.UserHostAddress
或某种服务器变量(HTTP_X_FORWARDED_FOR
,HTTP_CLIENT_IP
或REMOTE_ADDR
)或一种或两种其他方式来实现。
我们最近移动了数据中心,并且我们的3台Web服务器位于负载均衡器中。现在,这些解决方案中的大多数都记录了负载均衡器的IP地址,而不是实际最终用户的IP。根据我的研究,HTTP_X_FORWARDED_FOR
应该为我们提供了所需的IP(一旦我们正确配置了IIS /负载均衡器)。
我创建了一个DLL,希望将其插入到我们的其他应用程序中:
using System.Web.Mvc;
namespace MyIpReader
{
public class IpReader : Controller
{
public string GetXForwardIp()
{
if (Request == null || Request.ServerVariables["HTTP_X_FORWARDED_FOR"] == null)
return System.Web.HttpContext.Current.Request.UserHostAddress;
return Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
}
}
我将此DLL添加到我们的一个项目中并运行它,但是Request
对象始终为null
,因此最终返回了UserHostAddress
。
这是为什么,更重要的是我该如何解决?
如果有关系:我的MyIpReader
项目是.NET 4.5,并且System.Web.Mvc
DLL指出Runtime Version v4.0.30319
,而实际的Version
属性本身是5.2.3.0
>
答案 0 :(得分:2)
请求必须在网络请求的上下文中进行评估。
我向您起诉此解决方案:
namespace MyIpReader
{
public class IpReader : Controller
{
private string HttpRequest request;
public IpReader(HttpRequest request)
{
this.request = request;
}
public string GetXForwardIp()
{
if (this.request == null || this.request.ServerVariables["HTTP_X_FORWARDED_FOR"] == null)
return System.Web.HttpContext.Current.Request.UserHostAddress;
return this.request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}
}
}