我需要在所有操作中使用服务器的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)];
}
答案 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()
更好的解决方案:
初始化构造函数可能不可用的数据 调用。
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)];
}