当然,Request.UserHostAddress
方式很棒,但在Application_Start()
Request
对象尚不存在。
我想首先通过他/她的IP来猜测用户的位置 - 只需一次 - 当他/她进入网站时,并为他/她设置默认的区域设置。然后我会在其他地方操纵它。
我认为必须在Global.asax
中覆盖一个事件,其中Request
存在,但我无法找到该事件......
确实会有任何替代技巧......
更新:
事实上,我正在开发一个多语言网站,我使用MaxMind GeoIP
通过他们的IP获取用户所在的国家/地区。所以,我想找到一种方法,以便当用户进入网站时(仅限第一个请求)我检索他/她的国家并将其存储在Session或全局变量中。
我知道我可以通过Request.UserHostAddress
在任何其他地方实现我的目标,而且我没有任何问题 - 对于这个小应用程序,每个请求只需要一行开销就不是问题。
但是我想知道是否可以设置那个全局变量,只有一次...!?!
答案 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可能有帮助。