2011-07-17 73 views
1

這個問題涉及在C#中編寫大規模可擴展的客戶會話狀態類庫,我非常需要賢者的忠告。C#/ .NET 4.0架構自定義SessionState提供程序/模塊/ SessionItems集合類Lib?

根據已指導我原來的線程:

I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

希望這個線程可以被稱爲從陰曹地府回來,因爲我已經花了近48小時(有一些電力小睡)試圖爲了實現這裏闡述的想法,我必須承認我在解決方案領域有點失落,並希望能夠澄清一些問題。

請允許我解釋我在哪裏&什麼使我困惑&我正在努力完成什麼。後面&在這裏與詹姆斯&喬爾提出了偉大的觀點,但具體的實現超出鏈接離開我有點在黑暗中。

我想創建一個類庫/ DLL我可以在我的幾個項目中使用,繞過默認的sessionproate選項inproc,sql & stateserver。這對我來說有些新鮮,請原諒我的無知。更進一步,我是一個下降&骯髒的asp.net/C#編碼器和泛型,線程安全,鎖定和序列化的一些更微妙的細微差別確實傾向於傷害我的小頭:))

我已經開始根據我在MSDN上找到的寫入訪問的示例創建一個自定義的會話狀態提供程序。然後我發現了這個頁面,潘多拉的盒子開得很大,現在我無法將精靈拿回瓶中。我挖了更多,我找到了一個自定義sessionstate模塊的模板,我也將它添加到我的類庫中。 SO nowwwww ...我有自己的提供者和模塊,然後在閱讀Joel的許多提示後,最終創建了一個基於我在MSDN上找到的另一個示例的自定義會話狀態項目集合。

,最初是基於hashlist,不知何故,我最終把它變成一個排序列表,然後我似乎已經跟着一個喬爾的步驟之一是涉及到以下幾點:

鎖(typeof運算)改寫所有.cs文件使用鎖(thisLock)其中thisLock是一個私人靜態對象,按照這裏提到的Rico文章...我理解死鎖的「概念」,但這是我第一次嘗試縮放一個asp.net站點,我現在還不是很喜歡喬建築師。我不能在這裏懶惰,因爲我不希望建立在一個不穩定的基礎上,而只是爲了得到一堆難以在路上進一步發現錯誤的難題。

然後我遵循Joel關於鎖的「slim」版本的建議,並在我的classlib中工作。儘管如此,我的蜘蛛感還在刺痛告訴我,我基本上還處於服從模式而不是啓蒙模式,即我沒有在我的感知領域跳舞的NEO風格視覺。

所以我不斷回到這個頁面,就像一個丹布朗小說的難民一樣,現在我正看着喬爾的最後告誡,直到會議狀態集合被製成線程安全,多元統一才能保證沒有好處。所以我覺得是時候開始刷牙線程安全集合了。

那時我開始閱讀MSFT的文章http://msdn.microsoft.com/en-us/library/dd997305.aspx SortedLists &其他老年人,但顯然不是太好吃,不贊成仿製藥。現在我已經創建了整個業務層和linq圖層,這些圖層是可序列化的,用於購物車並存儲在離線數據庫中。

但事實是sessionstate,threadsafety,使用BOTH模塊&提供程序,並且此處缺少任何示例以進行調試,因此我的大腦驅動器不斷髮生紅燈現象並且散熱器正在搖擺。

MSFT說,在上面的鏈接,「在.NET Framework 2.0中引入的集合類System.Collections.Generic命名空間中被發現,其中包括列表,字典,等等。這些類提供了改進的類型安全和性能。相比在.NET Framework 1.0類然而,在.NET Framework 2.0集合類不提供任何線程同步,用戶代碼必須提供所有同步項目時添加或刪除多個線程同時

我們推薦併發。在.NET Framework 4的集合類,因爲它們不僅提供了.NET Framework 2.0中的集合類的類型安全,但比在.NET Framework 1.0的集合provid也更高效,更全面的線程安全è..」

所以詹姆斯八九不離十狂奔直通出口說我得到了它,這就是該線程的結束,但我已經經歷了一些非常奇特的行爲而調試。

  1. 我正在使用線束網站來測試我的會話庫。如果我指定了httpmodule和自定義提供程序,那麼只有模塊在線束/測試站點上運行時纔會啓動。但是,如果我修改了一個真正的成熟代碼庫的web.config,它會選擇提供者。

我確實意識到我可以一次使用一個通過不使用模塊來指向提供者的線束站點。

這是罰款,但現在,然後我發現自己對自己說,「自....你有一個自定義集合,但它線程安全的,我們仍然將其鎖定,我們應該從集合外側鎖定它,即在模塊或提供商?我的大腦說是「線程安全」封裝在集合本身。

而我怎麼才能真正知道,所有這些緩慢的page.aspx/longpage.aspx示例,其中必須等待對於一個線程來完成,即使用戶點擊另一個鏈接在挫折(什麼挫折?在網站上?滅亡的思想!)...

所以基本上,就像蟲子兔子,猶豫不決從殘酷的殘餘la bella luna I懇求你,「讓我在這裏......」

我在此事先感謝你對此事的及時考慮&別人的不朽的重要性。

最佳,

卡里·阿布拉莫夫,MCSD.NET(十年.NET &的我還是希望它是所有JQUERY寶貝!)

回答

0

聽起來像你真正需要的下一步要做的就是創建一個測試程序,可以同時在您的配線站點中調用多個頁面。這將模擬鎖定意味着受益的情況,它也將幫助您確定您的實現是否在邏輯上正確。如果沒有這個,我認爲你是盲目的工作。

希望有所幫助。

在一個側面說明:我目前正在對Redis的支持自定義會話狀態提供。我的計劃是有一個允許鎖定關閉的實現。一旦Github穩定,我可能會開源。