2009-12-25 57 views
4

根據我的研究,這是不可能的...除非我寫一個大的黑客(erk)來解決它...我想知道這是否可能,因爲你們中的一些人可能有更多的信息。我明白這將違背頁面範例,但它確實應該可以訪問...任何想法的人?WebService中的ViewState?這可能嗎?

討厭使用cookies作爲信息的更新,並反映了真正的價值收集後,一個完整的往返(所以總是1往返延遲)...我只是存儲一個數組真的...會話可用於webservices,但真的不想加載服務器太多,雖然它可能只有一半kb ...也許我只是太偏執?

任何意見,如果它值得麻煩不使用會話狀態,即時通訊使用cookie,喜歡使用viewstate,謝謝。

回答

1

只需創建緩存對象的會話對象:)緩存的.dispose內的數組應該從內存中釋放會話以及:)

3

爲什麼不使用應用程序緩存呢?它適用於此目的。

public static void AddToCache(string key, Object value, int slidingMinutesToExpire) 
{ 
     if (slidingMinutesToExpire == 0) 
     { 
      HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null); 
     } 
     else 
     { 
      HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(slidingMinutesToExpire), System.Web.Caching.CacheItemPriority.NotRemovable, null); 
     } 
    } 
+1

感謝,使用緩存聽起來是個好主意,但因爲這是應用程序級別的狀態,有沒有一種方法可以確保特定用戶的緩存信息在用戶會話過期時破壞自身?所以基本上,使它更像會話狀態,但具有讓內存管理系統在需要時更早地銷燬數據的優點。 謝謝 –

+1

AddToCache方法的第三個參數是slidingMinutesToExpire,它會在x分鐘後自動從應用程序緩存過期。所以我建議只提供一些價值(比如20分鐘),並且你的緩存會自動清理掉,因爲任何超過20分鐘的數據都會自動從緩存中清除。 – dcp

+1

@dcp真棒,謝謝你的領導,我想我會拿起我的asp.net 3.5書,並有一個很好的,完整的緩存系統的閱讀,我愛.net :) –

0

不,Viewstate與使用瀏覽器作爲HTTP客戶端緊密結合。

對於web服務,您有兩種選擇:讓客戶端跟蹤對話狀態,或者讓服務器跟蹤它。

  • 使用服務器會話狀態,並通過一個cookie(無論是HTTP Cookie或SOAP信封內的一些餅乾狀參數)

  • 要求客戶跟蹤,保留,並且可能傳送到服務器,對話狀態。


關於視圖狀態 - 這是爲的頁面狀態呈現給用戶,並作爲一種實現,它是緊耦合到瀏覽器。當頁面顯示時,viewstate信息用於填充頁面。之後,當頁面上的表單發佈時,相關的表單數據(其中一些可能已經用視圖狀態魔術預設)被髮送到服務器。服務器需要驗證來自客戶端的輸入,儘管在客戶端使用了viewstate。 您可以看到,viewstate加上一些輕量級的瀏覽器端人口邏輯是客戶端管理用戶所看到的頁面狀態的一種方式,但服務器無法放棄對話狀態的驗證。

這種方法可以在網絡服務應用程序中採取,但由於不依賴於瀏覽器或特定的演示文稿(或任何演示文稿),它是一個自己動手做的事情。客戶端應用程序以適合客戶端的方式維護和使用任何會話狀態。

另一方面,服務器管理狀態意味着每個「對話」或「會話」在服務器上都保留有狀態信息。如果服務器正在這樣做,客戶端不一定需要跟蹤信息。客戶端只是向服務器提供一個令牌(或者cookie,如果你喜歡的話),並且服務器將它用作狀態表中的查找鍵。服務器主要負責驗證代表客戶保留的所有狀態。

既然您使用.NET,您可能有興趣瞭解Workflow can be used server-side to track the state of a webservices (WCF) based conversation。這種方法維護WS網絡協議 - 它沒有規定任何特定的客戶端技術或平臺。

2

不,您不能在Web服務中使用ViewState。 ViewState需要一個隱藏的<input>字段和一個HTTP回發。 Web服務不支持輸入字段。

由於ViewState需要對數據進行編碼並將其發送到客戶端並再次返回,因此它不會比Cookie更高效,因爲它們是在協議級別實現的,而不是作爲HTML的一部分ViewState中。

或者,您可以使用會話狀態,並將信息保存在服務器上。

0

你不能使用ViewState(或者可能會在web服務中做很多不必要的努力工作:)但作爲備選方案,你可以使用會話狀態。在MSDN

[WebMethod(EnableSession=true)] 
public int SessionHitCounter() 
    { 
    ... 
    } 

更多信息here:會話狀態正在使用EnableSession值每的WebMethod啓用。

+0

感謝隊友,但我已經在webservices之前使用會話狀態:)...我認爲會有一種方法來做viewstate,但一個大量的黑客:) –

+0

即時通訊假設它可以從客戶端訪問,並且只是從客戶端到客戶端的webservice進行序列化/反序列化,並帶有特殊說明......或其他幾種可能性 –

+0

那麼,你可以嘗試一個選項I看到這裏:保存在服務器而不是客戶端的ViewState :)下面是一個示例:http://blogs.msdn.com/alikl/archive/2008/01/02/basic-sample-how-to-keep-asp-net-視圖狀態-ON-THE-server.aspx – terR0Q