2

当然这种Request.UserHostAddress方式很好,但是Application_Start()对象Request还不存在。

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

我认为必须有一个事件被覆盖Global.asax其中Request存在,但是我找不到那个事件......

事实上,任何替代技巧都会受到赞赏......

更新

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

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

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

4

3 回答 3

5

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 设置区域设置”究竟是什么意思?你能澄清一下这个任务吗?因为通常,对于每个请求执行,必须设置此“区域设置”信息。

于 2013-08-03T12:56:58.067 回答
2

你应该这样做

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;        
}
于 2013-08-03T13:00:11.093 回答
1

它可以通过使用 GlobalFilterCollection 来解决。您可以覆盖方法 OnActionExecuting 并添加必要的逻辑。本文:ASP.NET MVC 4 自定义操作过滤器可能会有所帮助。

于 2013-08-03T14:02:43.620 回答