2013-08-03 60 views
2

當然,Request.UserHostAddress的方式很棒,不過在Application_Start()Request對象還不存在。在Global.asax.cs中獲取客戶端IP地址 - 可以嗎?

我想首先通過他/她的IP猜測用戶的位置 - 只要一次 - 當他/她進入網站時,併爲他/她設置默認區域設置。然後我會在其他地方操縱它。

我認爲必須有Global.asax其中Request存在於它,但是我無法找到該事件被否決的事件......

事實上任何替代伎倆可以理解的......

更新

事實上,我正在開發一個多語言網站和我用MaxMind GeoIP通過IP來獲得用戶的國家。所以,我想找到一種方式,以便當用戶進入該網站時(僅且只有第一個請求),我檢索他/她的國家並將其存儲在Session或全局變量中。

我知道我可以通過Request.UserHostAddress實現我的目標,並且我對它沒有任何問題 - 每個請求只有一行開銷對於這個小應用程序根本不是問題。

但是,我想知道是否可以設置該全局變量,只有且只有一次...!?!

回答

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設置本地化」是什麼意思?你能澄清這個任務嗎?因爲一般來說,對於每個請求執行,必須設置這個「locale」信息。

+0

我想爲每個訪問該網站的用戶只發一次事件,因此,爲用戶設置默認語言環境一次。那個事件是我需要的嗎??! – AminSaghi

+0

不!每當用戶發送請求時,該事件就會觸發......! – AminSaghi

+0

是的,沒有任何事件,每個用戶訪問只會觸發一次。例如,如果用戶已經訪問過您的網站,則應使用會話進行檢查。但會話在Application_BeginRequest中不可用。 – Dmytro

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

它可以通過使用GlobalFilterCollection來解決。您可以重寫方法OnActionExecuting並添加必要的邏輯。本文:ASP.NET MVC 4 Custom Action Filters可能會有所幫助。