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中尚不可用。