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 記錄完整的代理鏈路。