在控制器构造函数中获取服务器IP

时间:2013-10-17 14:54:27

标签: asp.net-mvc request session-variables

我需要在所有操作中使用服务器的IP。

当我尝试将它放在控制器构造函数中时,它会抛出一个错误:

_runningServer = AppConstants.Common.ServerDetect[Request.ServerVariables["LOCAL_ADDR"].Substring(0, 4)];

我发现的原因是尚未创建http上下文。

我尝试使用System.Web.HttpContext.Current,但它没有做到这一点。

我在Intranet应用程序中使用服务器IP作为应用程序以各种方式配置自身的自动方式。

更新

似乎重写Intialize()对我的案例来说是更好的解决方案:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
    _runningServer =AppConstants.Common.ServerDetect[System.Web.HttpContext.Current.Request.ServerVariables["LOCAL_ADDR"].Substring(0, 4)];
}

3 个答案:

答案 0 :(得分:2)

你是对的,在实例化控制器时HttpContext不存在。我会看一下覆盖基本控制器的OnActionExecuting方法并将信息存储在那里。

public class MyBaseController : Controller
{
  public string _runningServer;

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      _runningServer = AppConstants.Common.ServerDetect[
        filterContext.HttpContext.Request.ServerVariables.
        ServerVariables["LOCAL_ADDR"].Substring(0, 4)];
        base.OnActionExecuting(filterContext);
    }
}

现在您已设置变量,httpContext目前可用。 _runningServer变量应该可用于所有控制器操作。为了在控制器中使用它,您只需要更改类声明。

public class HomeController : MyBaseController

答案 1 :(得分:1)

作为ActionFilter的替代方案,您可以创建自己的值提供程序,搜索 RequestHeaders 中的数据,并在模型绑定期间填充IP地址。

对价值提供商进行检查:IValueProvider

答案 2 :(得分:0)

在@Tommy的带领下,我在MSDN文档中发现Initialize()方法可能比OnActionExecuting()更好的解决方案:

MSDN LINK

  

初始化构造函数可能不可用的数据   调用。

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
    _runningServer =AppConstants.Common.ServerDetect[System.Web.HttpContext.Current.Request.ServerVariables["LOCAL_ADDR"].Substring(0, 4)];
}