2012-12-12 27 views
2

我使用WebMatrix中(C#)來設計,因爲我工作的組織Intranet的Web應用程序。是否有比使用會話變量更好的解決方案;會話變量真的應該在網頁中使用嗎?

我已經作出一個數據庫驅動的網站,和我目前正在另一個,並在一段時間,我一直有一些麻煩的Session變量隨機成爲空和引發錯誤。正因如此,一個簡單的會話變量與使用的服務器高速緩存,而不是交換(我本來以爲會比較波動,但仍有待觀察,到目前爲止...)

一個問題是, :是否有任何實際的會話變量使用?如果它真的像它看起來一樣不穩定,它們似乎對任何事都沒有好處。\

我知道他們在技術上是cookies,所以我知道他們的數據不應該依賴,但是其中存在這個問題。我需要將數據發送到我「可以」依賴的其他頁面。這留下了會話變量和cookie。

我一般遠離查詢字符串或URL數據遠,任何敏感信息(如社會保險號)的,他們明目張膽的「純文本」顯示,與其中,甚至SSL也無濟於事。

服務器高速緩衝存儲器也是揮發性的,並且不是要作爲依據。

屆時AppState變量是不特定的用戶。

,在這裏留下隱藏輸入字段...問題是,有時在「郵報」我做的Response.Redirect,而這樣的,所以C#不總是渲染後後頁面(似乎)。

或許這只是一個缺乏對我的部分知識,而是一種我似乎走投無路不管我走哪條路。

難道我真的對所有的頁面信息保存到與每一頁單獨的數據庫,並與其他頁面上的SQL查詢檢索它只是爲了獲得可靠的,而不是「明碼實價」顯示,從一個網頁到另一個信息與網頁?即使這種方法是使用幾個不同的用戶的問題,不是嗎?

+0

會話變數有其不利之處,但只要會話保持活躍狀態​​就應該穩定。 – lboshuizen

+3

一句話:會話變量不是「基本上是cookies」,它們根本不會**發送給客戶端。會話的ID是存儲在cookie中的唯一值,其餘的保持在服務器端。 –

+0

它取決於實現,但會話通常是跨Web前端,而緩存則不是。緩存應該主要用於重新使用可以重新計算性能的東西,因爲它可以在任何時候消失(這應該沒問題)。根據設計,會話更多的是不能重新計算的東西。 – Servy

回答

2

ASP.NET有不同的會話狀態模式:

  • 是InProc,這是在內存中。只要IIS應用程序池未被回收或整個IIS重新啓動,會話狀態就會一直存在。

  • 的SqlServer。這是會話狀態存儲在SQL Server存儲中。這是偉大的,因爲會議的IIS應用程序池或整個IIS重啓後存活,但它是一個瓶頸,因爲它意味着該會話的每個接入需要反序列化和/或會話狀態對象的序列化,畢竟,數據庫連接等上。

  • 的StateServer。類似於SqlServer,但使用Microsoft提供的會話狀態服務器。這種模式根本不使用,但它是一個選項...(我沒有經驗)。

  • 定製。您可以實現一些接口/抽象類並定義您自己的會話狀態存儲。

另一方面,會話狀態是服務器端,它與cookie無關。這是一種在HTTP統治的無狀態世界中模擬狀態的方式。由於ASP.NET在瀏覽器中寫入HTTP cookie,因此它可以將瀏覽器會話與唯一的服務器會話鏈接起來。

關於會話狀態是否有用......在我的情況下,我決定完全避免「狀態」。我寧願儘可能保持無國籍。我在瀏覽器中寫下一些HTTP cookie來識別設置,偏好或用戶,並且我按照請求做事情。

我更喜歡這樣做,因爲良好的緩存機制可以瘋狂地優化請求的性能,因爲在大多數情況下,您不會直接在存儲中訪問數據,而是在某個緩存中訪問數據,這意味着速度很快!

順便說一句,不應該使用會話狀態來存儲大對象,但基本值。會話狀態不是緩存。例如,會話狀態可能是存儲當前登錄用戶或他/她的角色等的好地方。或他們的個人資料標識誰知道。

任何其他數據應該在每個請求的基礎上查詢。

再說一遍:緩存應該是你的朋友在優化你的環境方面,不要訪問數據庫或每個請求中的任何內容,這會影響系統的性能。

+0

Fidemraizer,我很感激,我真的需要在這裏澄清。所以,Session變量似乎並不像我想的那樣不可靠。我想這可能是我遇到的一些其他問題,但我知道'不管它是什麼'它被分配了一些字符串值,然後在另一頁上幾乎立即被訪問,並且以某種方式神祕地成爲空/空,似乎沒有理由。代碼中沒有任何地方允許它在被訪問之前是空的或空的。 – VoidKing

+0

此外,它只在我們的服務器上,並且我認爲在App_Pool回收之前允許IIS使用的默認內存幾乎不可能達到,所以不應該這樣做,但是誰知道。 – VoidKing

+0

@VoidKing是的,實際上InProc模式是非常不可靠的。如果您需要可靠性,請轉到SqlServer模式。由於以SqlServer模式存儲會話值意味着這些值必須被序列化和反序列化,但是您需要再次檢索它們,請謹慎存儲簡單值:字符串,整數,小對象......如果你這樣做,你的表現就不會受到太大的影響。例如,默認情況下SharePoint帶有SqlServer模式,它適用於大型企業。 –