Asp.net mvc 中的HttpContext


一直以來對HttpContext都很模糊 今天特意在網上看了下 隨便把整合記錄下!

msdn解釋:

HttpContext類:封裝有關個別HTTP請求的所有HTTP特定的信息,又叫上下文。
看到這個解釋,我覺得有些抽象,Http特定信息具體又是什么?看了下備注:
為繼承 IHttpModule 和 IHttpHandler 接口的類提供了對當前 HTTP 請求的 HttpContext 對象的引用。該對象提供對請求的內部 Request、Response 和 Server 屬性的訪問。

這樣一來,一下子又冒出來2個新東西: IHttpModule 和 IHttpHandler。真叫人抓狂啊。

先看HttpContext:
    1.聲明周期:從用戶發送請求開始到服務器處理完請求並生成內容返回到客戶端為止。原來就是從點擊一個鏈接開始,到看到這個鏈接里的全部內容為止,這個理解了。
    備注:針對每個不同用戶的請求,服務器都會創建一個新的HttpContext實例直到請求結束,服務器銷毀這個實例.
    2.HttpContext的作用:處理請求的屬性如:request,response,server等。其實我們在開發asp.net頁面的時候,可以直接使用request...這些類啊,為什么要通過HttpContext類來訪問呢?原來,request等這些類可以在asp或aspx頁面的代碼中直接使用,但是在IHttpModule或IHttpHandler中就不能直接使用了。這是因為要在特殊場合訪問request等。因為HttpContext類對Request,Respose,Server等等都進行了封裝,並保證在整個請求周期內都可以隨時隨地的調用.)OK,這個也理解了。
    3.HttpContext其它功能:HttpContext還可以處理CacHe,HttpContext.Item等,在其生命周期內可以存儲一些臨時數據,方便隨時使用。
    
    再度理解HttpContext:
    當用戶發送某個Http請求,我們可以通過HttpContext進行截獲,查看里面包含了哪些請求的信息,然后可以進行一系列的操作,比如說切換到其他的頁面,這個時候,可以重組請求的數據滿足新頁面的要求。即:即使不在page頁面中,也可以通過HttpContext的Current屬性來獲取當前的web狀態。
    
    正是由於此,我們可能在程序中濫用HttpContext,這里有一篇文章可以幫助大家理解為什么不能濫用HttpContext:
    http://odetocode.com/articles/112.aspx
   雖然是04年的文章,但是,假如你沒有看過或理解HttpContext,它對於我們來說都是新的。
    
    當然了,要想完全理解HttpContext,我們還需要了解很多知識:比如:Cache,Profile,IHttpHandler,IHttpModule。這些知識一定要在實踐中才能理解的更加深入。

 

   實例:mvc FormsAuthenticationTicket

   代碼:

  

        /// <summary>
        ///  xxxx
        ///  調用在控制器前面添加[Authorize(Roles = "xxxx")] 注意在Global.asax使用票創建IPrincipal對象並存在HttpContext.User中
        ///  原理,將用戶角色信息保存在票據中,通過Global.asax,WEB.CONFIG中的設置,判斷角色的權限 
        /// </summary>
        public static void FormsAuthen(string name, string rose)
        {
            FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
                                            1,// 版本號。
                                            name,// 與身份驗證票關聯的用戶名。 
                                            DateTime.Now,// Cookie 的發出時間。
                                            DateTime.Now.AddMinutes(40),// Cookie 的到期日期。 
                                            false,// 如果 Cookie 是持久的,為 true;否則為 false。 
                                            rose//寫入用戶角色
                                            );
            //加密
            string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
            //存入Cookie 
            System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
            System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);

 Global.asax  文件代碼:

  

        protected void Application_AuthenticateRequest(Object sender, EventArgs e)
        {
            HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie == null || authCookie.Value == "")
            {
                return;
            }
            FormsAuthenticationTicket authTicket = null;
            try
            {
                authTicket = FormsAuthentication.Decrypt(authCookie.Value);//解密 
            }
            catch
            {
                return;
            }
            string[] roles = authTicket.UserData.Split(new char[] { ';' });//根據存入時的格式分解,;或|.... 
            if (Context.User != null)
            {
                Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);//存到HttpContext.User中 
            }
        }

  

我們既然寫了 那怎么讀取呢? 那就利用HttpContext類(簡單點說他就是封裝了用戶的一些信息 至於為什么呢要存呢 瀏覽器是無狀態的)

代碼:

System.Web.HttpContext context = System.Web.HttpContext.Current;
            // 取得用戶對象
            System.Security.Principal.IPrincipal user = context.User;
            // 取得用戶的角色數組
            System.Web.Security.FormsIdentity fi = user.Identity as System.Web.Security.FormsIdentity;
            // 取得用戶的票據
            System.Web.Security.FormsAuthenticationTicket ticket = fi.Ticket;
            // 創建用戶所擁有的角色數組
            string roleString = ticket.UserData;
            // 還原為字符串數組
            string[] roleArray = { roleString };//roleString.Split(',');

            // 自己創建用戶對象
            System.Security.Principal.GenericPrincipal principal
                = new System.Security.Principal.GenericPrincipal(
                    user.Identity,
                    roleArray
                    );
            // 讓系統使用我們的擁有角色的用戶對象
            context.User = principal;
            Response.Write(xxxx);

  資料:http://www.cnblogs.com/zhongjie/archive/2011/06/12/2078939.html(這里引用下評論1樓的話 )

     這篇文章是講的ASP.NET Web Form機制中的頁面生命周期和ASP.NET MVC是兩碼事。MVC其實理解起來很更簡單,就像ASP一樣,所有的操作都是由Request驅動的。說         白了就是只用知道當前請求的Url歸那個Controller中action執行,執行時需要用到哪些數據(Model),執行后在那個試圖(View)上顯現這個Model即可。我的感覺是要比web form的方式理解起來更簡單些。asp.net web form更像是在開發windows程序,而ASP.NET MVC才像是做Web開發。

這篇文章也是講解  HttpContext 

 http://www.cnblogs.com/duanx/archive/2009/07/25/1459017.html

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM