如何从链接的DLL引用请求对象?

时间:2018-10-05 11:47:41

标签: asp.net asp.net-mvc

我的公司有多种软件产品,它们能够记录IP地址。每种产品的操作方式都不同,可以通过HttpContext.Request.UserHostAddress或某种服务器变量(HTTP_X_FORWARDED_FORHTTP_CLIENT_IPREMOTE_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

1 个答案:

答案 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();
        }
    }
}