在Global.asax.cs中获取客户端IP地址 - 是否可能?

时间:2013-08-03 12:47:55

标签: c# asp.net-mvc-4 ip global-asax

当然,Request.UserHostAddress方式很棒,但在Application_Start() Request对象尚不存在。

我想首先通过他/她的IP来猜测用户的位置 - 只需一次 - 当他/她进入网站时,并为他/她设置默认的区域设置。然后我会在其他地方操纵它。

我认为必须在Global.asax中覆盖一个事件,其中Request存在,但我无法找到该事件......

确实会有任何替代技巧......

更新

事实上,我正在开发一个多语言网站,我使用MaxMind GeoIP通过他们的IP获取用户所在的国家/地区。所以,我想找到一种方法,以便当用户进入网站时(仅限第一个请求)我检索他/她的国家并将其存储在Session或全局变量中。

我知道我可以通过Request.UserHostAddress在任何其他地方实现我的目标,而且我没有任何问题 - 对于这个小应用程序,每个请求只需要一行开销就不是问题。

但是我想知道是否可以设置那个全局变量,只有一次...!?!

3 个答案:

答案 0 :(得分:4)

Application_Start()不是正确的事件,您可以在其中执行此操作。它不会针对用户的每个请求运行,它会对asp.net应用程序进行一些基本的初始化。

更好的解决方案是用户,例如

protected void Application_BeginRequest(){}

在客户请求开始时运行。

关于最早的事件,其中请求和会话都可用......似乎是

void Application_AcquireRequestState(object sender, EventArgs e)
{
    if (System.Web.HttpContext.Current.Session != null)
    {
        if (Session["locale"] != null)
        {                  
             //already set variable. 
        }
        else
        {
            //set some variable
            Session["locale"] = "code";
        }
    }
}

但是,您想要通过“基于IP设置区域设置”到底意味着什么呢?你能澄清这个任务吗? '因此,一般情况下,对于每个请求执行,必须设置此“区域设置”信息。

答案 1 :(得分:1)

你应该这样做

public void Init(HttpApplication context)
{
    context.BeginRequest += (Application_BeginRequest);
}

private void Application_BeginRequest(object source, EventArgs e)
{
    var context = ((HttpApplication) source).Context;
    var ipAddress = context.Request.UserHostAddress;        
}

答案 2 :(得分:1)

可以使用GlobalFilterCollection来解决。您可以覆盖OnActionExecuting方法并添加必要的逻辑。这篇文章:ASP.NET MVC 4 Custom Action Filters可能有帮助。