ASP.NET MVC Controller Session問題


  發現問題

  最近在項目中遇到這樣一個問題,一直沒辦法重現,所以幾天都沒有解決。

  測試那邊給出的問題是這樣的:每天早上來的時候,第一次通過單點登錄到系統的時候,總會跳轉回登錄界面,再次登錄就好了。當時給我的第一印象是,好怪啊,不過應該是系統中的問題,根據描述,我這邊也測試了,不過在我這里就是不重現這個問題。昨天下班后,自己在研究別的問題,突然感覺的一絲靈感,既然是每天第一次出現問題,應該是什么東西過期了,才會導致這樣的問題。就想到了session,而session的工作原理是根據本地保存的sessionId,於是我清了瀏覽器的緩存和Cookie,結果問題真的重現了。對於系統問題來說,只要能重現,就算解決了一半了。

  根據我的想法,我跟蹤了session的保存和讀取,在LoginController中保存用戶session,頁面跳轉到HomeController中讀取session,就在這里發現了問題,在這個控制器里面根本讀取不到session,這是什么問題呢?於是想到了MVC的工作機制,由於我們的訪問經過路由處理器處理后,生成了響應的相應URL的實例MVCRouteHandle,對於System.Web.HttpContext.Current.Session["userinfo"]這樣的方式,訪問的只能是當前訪問的Request的包裝HttpContext中的東西,想要訪問另一個路由或者說URL中Session是不行的。

  解決問題

  1、 public ActionResult Index()
        {

            if (Login())
            {
                return Redirect("/Home/Main");
            }
            else
            {
                Response.Redirect(_logoutUrl);
            }
            return null;
        }

  這種方式采用了Redirect方式進行跳轉,其實並不屬於跳轉,它是將"/Home/Main"頁面的內容作為當前Action的返回值,這樣就屬於同一個訪問域下了,Session自然能夠取到;

  2、這是我從Stack Overflow上找到的一個方式,意思就是在BaseController中定義一個HttpSessionStateBase的變量用於存儲Session,這種方式需要我們的Controller都是繼承自BaseController,這樣也是可以的。

    這里要說明一下HttpSessionStateBase是在system.web命名控件下的一個類,在system.web,mvc下的抽象類Controller下,其實已經給我們定義好了一個Session只讀屬性。

    

    我們可以直接使用它,所以在使用的過程中,各位要注意自己應用的使這個還是System.Web.HttpContext.Current.Session!!!

  3、我找了一些資料,網上還有一種方式是利用SessionHelper來實現的,我看了源代碼,里面的實現方式是利用cookie。感興趣大家可以去找找,應該有很多。

 


免責聲明!

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



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