在BaseController中获取用户IP?

时间:2013-10-26 22:00:21

标签: c# asp.net-mvc asp.net-mvc-4

我正在制作base controller我的其他controllers将继承而且我要做的其中一件事就是抓住用户的IP Address并检查它是否是那个我想,如果不是,我想将它们重定向到主页。我在普通控制器中测试了代码并且工作正常但是只要我将代码移动到BaseController,就会出现Null Reference Exception错误。如何在基本控制器中使用它?

using FFInfo.WebUI.Controllers;
using System.Web.Mvc;

namespace FFInfo.WebUI.Areas.Admin.Controllers
{
    public class AdminBaseController : GlobalBaseController
    {
        public AdminBaseController()
        {
            if (HttpContext.Request.ServerVariables["REMOTE_HOST"] != "ValidIP")
            {
                RedirectToAction("Index", "Home", new { area = "" });
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

在我看来,在基础构造函数中重定向还为时过早。在Controller初始化期间,您的HttpContext似乎为null,因此您可能会获得null ref异常。

我会寻找一种不同的方法,例如创建一个ActionFilter。并在任何需要的地方使用它。您可以注册为全局过滤器或控制器级别等。像这样。

    public class IpCheckFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext) {
        if (filterContext.HttpContext.Request.ServerVariables["REMOTE_HOST"] != "ValidIP")
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary { { "controller", "Home" }, { "action", "Index" } });
        }
    }

    [IpCheckFilter]
    public class HomeController : AdminBaseController
    {
         public HomeController() : base()
         {            
         }
    }