C# 在Global.asax.cs中获取客户端ip地址-可能吗?

C# 在Global.asax.cs中获取客户端ip地址-可能吗?,c#,asp.net-mvc-4,ip,global-asax,C#,Asp.net Mvc 4,Ip,Global Asax,当然,Request.UserHostAddress方式很好,但是在Application\u Start()中,Request对象还不存在 我想在用户进入web站点时,首先通过他/她的IP猜出用户的位置(仅一次),并为他/她设置默认的区域设置。然后我会在其他地方操纵它 我认为必须在Global.asax中覆盖一个Request中存在的事件,但是我找不到该事件 事实上,任何其他的技巧都会被欣赏 更新: 事实上,我正在开发一个多语言网站,我使用maxmindgeoip通过他们的IP获取用户的国家。

当然,
Request.UserHostAddress
方式很好,但是在
Application\u Start()
中,
Request
对象还不存在

我想在用户进入web站点时,首先通过他/她的IP猜出用户的位置(仅一次),并为他/她设置默认的区域设置。然后我会在其他地方操纵它

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

事实上,任何其他的技巧都会被欣赏

更新

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

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

然而,我想知道是否有可能设置该全局变量,并且只能设置一次

应用程序\u 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设置语言环境”到底是什么意思?你能澄清这项任务吗?”原因通常,对于每个请求执行,必须设置此“区域设置”信息。

您应该这样做

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;        
}

它可以通过使用全局过滤收集来解决。您可以重写OnActionExecuting方法并添加必要的逻辑。本文:可能有帮助。

我希望每个访问站点的用户只触发一次事件,因此,为用户只设置一次默认区域设置。那是我需要的吗。。。?!不每次用户发送请求时都会触发该事件。。。!是的,没有事件,每次用户访问只会触发一次。如果用户已经访问了您的站点,您应该使用会话等方法进行检查。但会话在应用程序_BeginRequest中尚不可用。