我正在實現一個用戶控件,它具有一個將Action委託作爲parm的方法。Asp.net:委託(「行動」)可以序列化爲控制狀態?
試圖將委託存儲在「控制狀態」中會產生序列化錯誤。甚至有可能序列化委託到控制狀態?
BP
我正在實現一個用戶控件,它具有一個將Action委託作爲parm的方法。Asp.net:委託(「行動」)可以序列化爲控制狀態?
試圖將委託存儲在「控制狀態」中會產生序列化錯誤。甚至有可能序列化委託到控制狀態?
BP
不容易 - 它可以打開大門的潛在問題。
理論上可以使用反射來確定代理正在調用哪個對象的方法,併爲其編寫一個自定義序列化過程。在反序列化之後,您將再次需要編寫邏輯來將信息轉換爲委託引用。
問題是,在一般情況下,在運行時發現對象需要重新生成委託並不總是可能的。如果代理引用一個lambda或匿名方法,這會更復雜,因爲它們可能涉及關閉。
你可能好不:
不保留請求之間的行動,並委託具有ASP.NET代碼重新附加委託上回發。這是最沒有風險的選擇恕我直言。
在會話狀態中存儲委託引用,並在回發時將其重新附加到反序列化對象。這個選項是有風險的,原因有二:
一)持有在內存無限期對象引用如果最終用戶永遠不會回發,或者你忘了從服務器狀態清除的對象。
B)如果委託引用頁面元素(控制等),你可能會遇到 到微妙的錯誤,因爲代表將針對對象進行操作從以前要求,而不是新的要求。
在這篇文章中,作者序列化一個Action對象,以便在以後執行。 您可以將自己的操作擴展爲一個字符串,而不是一個文件。
很有意思:
http://mikehadlow.blogspot.com/2011/04/serializing-continuations.html
我懷疑...雖然,我願意試一試漂亮多了。 解決方案1將需要存儲一些證據以確定重新附加哪個方法/代理。 在解決方案1中,會話將在60分鐘後超時,並且當時代理將從服務器狀態中刪除,不是嗎? 謝謝,BP – theBruce 2009-12-22 17:48:03
會話超時將導致狀態被丟棄,並與它的委託和圖表該委託的任何對象被保持在存儲器中。但是,如果您正在構建一個許多用戶訪問的網站,這可能會導致服務器資源緊張,如果該委託導致請求之間保留大型對象圖。 ALO,如果你對每個響應不清除會話狀態,你可以用多個實例在內存中結束了(假設你不重用會話狀態鍵)。如果您重新使用會話狀態密鑰,則會面臨同一用戶打開第二個窗口/選項卡並遇到狀態衝突的風險 – LBushkin 2009-12-22 17:53:03
根據您的評論,我認爲我很好,可以將代表保存到會話狀態。 (它工作得很好!) 少量的用戶,微小的對象圖,usercontrol被包裝在一個ajax模式對話框中,所以不止一個調用是不可能的。是啊! 再次感謝。 BP – theBruce 2009-12-22 19:02:44