2009-12-22 42 views

回答

3

不容易 - 它可以打開大門的潛在問題。

理論上可以使用反射來確定代理正在調用哪個對象的方法,併爲其編寫一個自定義序列化過程。在反序列化之後,您將再次需要編寫邏輯來將信息轉換爲委託引用。

問題是,在一般情況下,在運行時發現對象需要重新生成委託並不總是可能的。如果代理引用一個lambda或匿名方法,這會更復雜,因爲它們可能涉及關閉。

你可能好不:

  1. 不保留請求之間的行動,並委託具有ASP.NET代碼重新附加委託上回發。這是最沒有風險的選擇恕我直言。

  2. 在會話狀態中存儲委託引用,並在回發時將其重新附加到反序列化對象。這個選項是有風險的,原因有二:

    一)持有在內存無限期對象引用如果最終用戶永遠不會回發,或者你忘了從服務器狀態清除的對象。

    B)如果委託引用頁面元素(控制等),你可能會遇到 到微妙的錯誤,因爲代表將針對對象進行操作從以前要求,而不是新的要求。

+0

我懷疑...雖然,我願意試一試漂亮多了。 解決方案1將需要存儲一些證據以確定重新附加哪個方法/代理。 在解決方案1中,會話將在60分鐘後超時,並且當時代理將從服務器狀態中刪除,不是嗎? 謝謝,BP – theBruce 2009-12-22 17:48:03

+0

會話超時將導致狀態被丟棄,並與它的委託和圖表該委託的任何對象被保持在存儲器中。但是,如果您正在構建一個許多用戶訪問的網站,這可能會導致服務器資源緊張,如果該委託導致請求之間保留大型對象圖。 ALO,如果你對每個響應不清除會話狀態,你可以用多個實例在內存中結束了(假設你不重用會話狀態鍵)。如果您重新使用會話狀態密鑰,則會面臨同一用戶打開第二個窗口/選項卡並遇到狀態衝突的風險 – LBushkin 2009-12-22 17:53:03

+0

根據您的評論,我認爲我很好,可以將代表保存到會話狀態。 (它工作得很好!) 少量的用戶,微小的對象圖,usercontrol被包裝在一個ajax模式對話框中,所以不止一個調用是不可能的。是啊! 再次感謝。 BP – theBruce 2009-12-22 19:02:44