轉自:http://blog.csdn.net/danielhf
在asp.net中, context 對應於 HttpContext 類, 它承載了所有當前請求的相關資訊, 在 Http 管道當中, 可以任何時刻通過它擷取如 Request, Response, Session, Cache 等有用的相關對象, 尤其在HttpHandler 和 HttpModule 當中, 在 Page 中, 我們也可以通過訪問公用屬性 Session, Request 等, 但實際上和通過 HttpContext 調用的效果是等同的.
除此之外, HttpContext 還有一個索引器, 它返回一個 IDictionary 的字典對象, 意即索引值對, 如果在請求被處理之初添加資料, 這個資料集合將可以在當前請求的整個處理過程中被所有對象共用, 包括 HttpHandler, HttpModule, Application等, 在請求結束後, 這個資料集合會隨著 HttpContext 一起被丟棄,所以, 可在此加入一些特定於自己應用程式的資料.
在這個論壇中有一個 ForumContext 類, 它屬於 AspNetForums.Components 名字空間, 在原來的HttpContext 的基礎之上, 它封裝了一些和該應用相關的環境資訊在裡面, 包括欄位和方法, 以使其可擷取與特定論壇相關的任何資訊, 看代碼:
using System;
using System.Web;
using System.Collections;
using AspNetForums.Enumerations;
namespace AspNetForums.Components {
public class ForumContext {
// 當前論壇的所有資訊, 初始化為負值以在代碼中判斷其是否合法.
int forumID = -1;
int messageID = -1;
int forumGroupID = -1;
int postID = -1;
int threadID = -1;
int userID = -1;
string userName = "";
int pageIndex = -1;
int roleID = -1;
string queryText = "";
string returnUrl = "";
HttpContext context;
DateTime requestStartTime = DateTime.Now;
// 這個對象在原有 HttpContext 基礎上進行了額外資訊的封裝.
public ForumContext() {
context = HttpContext.Current;
if (context == null)
return;
// 從 query string 也即 URL 中擷取所有論壇相關的參數, 填充欄位.
postID = GetIntFromQueryString(context, "PostID");
forumID = GetIntFromQueryString(context, "ForumID");
forumGroupID = GetIntFromQueryString(context, "ForumGroupID");
userID = GetIntFromQueryString(context, "UserID");
messageID = GetIntFromQueryString(context, "MessageID");
pageIndex = GetIntFromQueryString(context, "PageIndex");
roleID = GetIntFromQueryString(context, "RoleID");
queryText = context.Request.QueryString["q"];
returnUrl = context.Request.QueryString["returnUrl"];
}
// 如果為空白就重新生一個, 否則從當前 Context 的items集合中取回 ForumContext 對象.
public static ForumContext Current {
get {
if (HttpContext.Current == null)
return new ForumContext();
return (ForumContext) HttpContext.Current.Items["ForumContext"];
//這句話不解,難道Items可以存放ForumContext對象??
}
}
// 解析請求 URL 中的參數
public static int GetIntFromQueryString(HttpContext context, string key) {
int returnValue = -1;
string queryStringValue;
// 從請求中擷取 key 對應的值
queryStringValue = context.Request.QueryString[key];
// 如果沒有提供這個參數, 返回 -1, 即預設值.
if (queryStringValue == null)
return returnValue;
// 找到了就試圖將它轉換為一個整數
try {
// 某種情況下字串裡有一個#號, 就把#號以前的字元轉換成整數.
if (queryStringValue.IndexOf("#") > 0)
queryStringValue = queryStringValue.Substring(0, queryStringValue.IndexOf("#"));
// 否則直接轉換
returnValue = Convert.ToInt32(queryStringValue);
}
catch {}
return returnValue;
}
// 重新導向到一個顯示錯誤訊息的頁面, 這個錯誤訊息封裝在相應的異常對象中,
// GetSiteUrls 方法返回 SiteUrls 對象, 它擁有在 SiteUrls.xml 文檔中的路徑資訊,
// 將 ExceptionType 枚舉對應的整數值作為參數傳給 Msg/default.aspx 頁面.
public static void RedirectToMessage (HttpContext context, ForumException exception) {
if ((exception.InnerException != null) && ( exception.InnerException is ForumException)) {
ForumException inner = (ForumException) exception.InnerException;
}
context.Response.Redirect(Globals.GetSiteUrls().Message( exception.ExceptionType ), true);
}
// 從緩衝中取出 ForumsTable 對應的那個雜湊表, 用 forumID 來尋找相應的 Forum 對象
public Forum GetForumFromForumLookupTable(int forumID) {
Forum f = (Forum) this.ForumLookupTable[forumID];
// 如果找到, 直接返回
if (f != null)
return f;
// 如果沒找到且緩衝中這個雜湊表還在, 意即尚未到期,
// 則清除緩衝中的資料, 試圖重新載入最新的
if ( (f == null) && (context.Cache["ForumsTable"] != null) )
context.Cache.Remove("ForumsTable");
// 再試著找一次
f = (Forum) ForumLookupTable[forumID];
// 如果重新載入資料仍未找到, 那這個 ID 肯定是錯的
if (f == null) {
throw new Exception("Forum ID is invalid");
}
return f;
}
// 返回一個雜湊表, 這個表的鍵是 ForumID, 值為 Forum 對象
public Hashtable ForumLookupTable {
// 緩衝中名為 ForumsTable 鍵就對應這個雜湊表, 如果它已經到期, 則添加一個
// GetForums 這個方法返回這個雜湊表, 它被放進緩衝中, 對應 ForumsTable
// 的索引值, 生存期為 120 分鐘, 無依賴項.
get {
if (HttpRuntime.Cache["ForumsTable"] == null)
HttpRuntime.Cache.Insert("ForumsTable", Forums.GetForums(this, 0, true, false), null, DateTime.Now.AddMinutes(120), TimeSpan.Zero);
return (Hashtable) HttpRuntime.Cache["ForumsTable"];
}
}
public static string GetApplicationName () {
return GetApplicationName (HttpContext.Current);
}
// 得到一個字串如 localhost/sample/test.aspx, 主機名稱+虛擬目錄+頁面名
public static string GetApplicationName (HttpContext context) {
if (context == null)
return "";
string hostName = context.Request.Url.Host;
string applicationPath = context.Request.ApplicationPath;
return hostName + applicationPath;
}
// 一個 Singleton 模式 返回一個 HttpContext 對象
public HttpContext Context {
get {
if (context == null)
return new HttpContext(null);
return context;
}
}
public int MessageID { get { return messageID; } }
public int ForumID { get { return forumID; } }
public int ForumGroupID { get { return forumGroupID; } }
public int PostID { get { return postID; } }
public int ThreadID { get { return threadID; } }
public int UserID { get { return userID; } }
public string UserName { get { return userName; } set { userName = value; } }
public int RoleID { get { return roleID; } }
public string QueryText { get { return queryText; } }
public string ReturnUrl { get { return returnUrl; } }
public int PageIndex { get { return (pageIndex - 1); } }
public DateTime RequestStartTime { get { return requestStartTime; } }
public User User { get { return Users.GetUser(); } }
public SiteStatistics Statistics { get { return SiteStatistics.LoadSiteStatistics(context, true, 3); }}
}
}