【问题标题】:Getting client ip address in Global.asax.cs - is it possible?在 Global.asax.cs 中获取客户端 IP 地址 - 有可能吗?
【发布时间】:2013-08-03 12:47:55
【问题描述】:

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

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

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

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

更新

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我希望每个访问该站点的用户只触发一次事件,因此,只为用户设置一次默认语言环境。那是我需要的活动吗?!
    • 不!每次用户发送请求时都会触发该事件...!
    • 是的,没有事件,每次用户访问只会触发一次。您应该检查用户是否已经访问过您的站点,例如使用会话。但 Session 在 Application_BeginRequest 中尚不可用。
    【解决方案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;        
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-01-14
        • 2020-01-16
        • 2013-07-07
        • 2011-05-26
        • 2019-11-13
        • 1970-01-01
        • 2011-01-08
        • 2014-12-29
        • 2010-09-10
        相关资源
        最近更新 更多