1. Context 名詞解析 Context 直接翻譯就是上下文。"上下文" 這個名詞還是挺讓人費解的,是一個非常泛化的概念。剛看到有點讓人摸不著頭腦,一個高端大氣上檔次的名詞,如果要找一個類似的解釋可以是我們讀文章會用到的語境。 我們講個“語境” 與“上下文”的例子,可能可以幫助理解。比如“他是 ...
1. Context 名詞解析 Context 直接翻譯就是上下文。"上下文" 這個名詞還是挺讓人費解的,是一個非常泛化的概念。剛看到有點讓人摸不著頭腦,一個高端大氣上檔次的名詞,如果要找一個類似的解釋可以是我們讀文章會用到的語境。 我們講個“語境” 與“上下文”的例子,可能可以幫助理解。比如“他是背著包袱離開家的,”“包袱”在這裡面有點歧義。 這句話可以理解為“他背著一包東西離開了家”,也可以說“他帶著思想負擔離開了家”,在這裡詞語“包袱”只有藉助特定的語境才能確定其真正含義。 那麼我們在 web 中經常使用到的Session , 也是這樣的, 單單給你一個Session,你是沒有辦法知道具體的含義的,每個請求過來的 Session可能都會不一樣,可能有些裡面就沒有值,只有在運行時每一次請求上下文中我們獲取的這個Session的值才是有意義的。 2. HttpContext 的簡單介紹 首先我們來看一下這個類的定義,這裡面只是截取了部分,標紅的是我們經常用到的,有些是每一次請求必須要用到的,既然我用了請求這個詞,那就是對應的 HttpRquest。有請求就會有返回,這個就是HttpReponse。 我們首先看一下 命名空間 System.Web,這個只要稍微知道一下,有時我們要用一個 api 經常不知道它所在的命名空間。 HttpRequest 的定義 這個是與請求有關的所有參數,看這個主要是瞭解 Request 的大概內容。 如果你要獲取一個跟瀏覽器有關的信息,比如cookie 的值,那你應該從這個地方來找一下有沒有,如果連這個地方都沒有,那很大可能性,你是沒有辦法得到的。當然 cookie這邊是有的。再看一下QuertString上面 有具體的使用方法,這些方法不是我自己寫上去的,是api裡面自帶的,告訴你怎麼使用的,這些關註一下,可以加深你對一個api的記憶。 當你不知道一個api怎麼用的時候,先去定義裡面看一下關於這個api的各種信息,裡面總歸有一個是適合你的,如果實在找不到,可以考慮一下你要找的信息是不是在其他api裡面,與HttpRequest 有關嗎,比如你要指定返回信息的字元集,那應該到 HttpReponse 裡面去找,我們不能用一個化學方程式來解決一個牛頓力學問題,不過好像現在大部分汽車的能量來源是化石燃料,化學方程式可能也可以處理物理問題。 HttpReponse 的定義 這個是與返回有關的所有參數,如果你要指定返回的字元集,那你可以指定 Charset。 我們發現HttpReponse裡面也有一個 Cookies,那麼這個 Cookies 和 HttpRequest 是同一個嗎?如果你有答案了可以驗證一下。 var requestCookie = HttpContext.Current.Request.Cookies; var reponseCookie = HttpContext.Current.Response.Cookies; var b = requestCookie.Equals(reponseCookie); 3 . HttpContext 總結 通過上面的兩個例子,給我們的感覺 Context 有點像一個倉庫,我們需要什麼就可以去裡面拿,如果在這裡面也找不到.,那其他地方就很難再找到了。下麵我們重新認識一下HttpContext。 HttpContext 就是關於 Http請求過程中涉及到的所有變數或者引用存放的一個倉庫。 類似的我們還有 DbContext, ApplicationContext 。在這裡面我們提到了 “上下文”、“倉庫” 這些名詞,在這篇文章的邊界之內,指代的就是 Context 這個概念。 4. 小思考 既然我們知道了這些,那就給你出個小題目唄,如果要獲取用戶的 IP 那應該從哪裡去找,可能有時候獲取的值跟你想象的不一樣,應用伺服器前面有了一層反向代理伺服器比如 Nginx , 會不會影響我們這種方式取IP地址呢,這時我們該怎麼辦。 這裡面涉及到一個小定義 X-Forwarded-For:簡稱XFF頭,它代表客戶端,也就是HTTP的請求端真實的IP,只有在通過了HTTP 代理或者負載均衡伺服器時才會添加該項。它不是RFC中定義的標準請求頭信息,在squid緩存代理伺服器開發文檔中可以找到該項的詳細介紹。標準格式如下:X-Forwarded-For: client1, proxy1, proxy2 var headers = HttpContext.Current.Request.Headers; var forward = headers["X-Forwarded-For"]; forward 記錄完整的代理鏈路。