我有一個簡單的WCF服務,通過提供用戶名和密碼讓客戶/消費者應用程序登錄。如果用戶名和密碼都正確,則WCF服務爲客戶端提供一個GUID。然後將GUID和用戶名作爲鍵/值對存儲在WCF服務中。從這裏開始,客戶發送他們的GUID作爲識別的一種手段。默認情況下WCF服務是無狀態的嗎?
因爲我在Dictionary/Hashmap中存儲了鍵/值對,所以這種方法只有在WCF服務是有狀態的時纔有效。問題是,它們是默認的狀態,還是有一些我必須做的使它們以這種方式行事?
我有一個簡單的WCF服務,通過提供用戶名和密碼讓客戶/消費者應用程序登錄。如果用戶名和密碼都正確,則WCF服務爲客戶端提供一個GUID。然後將GUID和用戶名作爲鍵/值對存儲在WCF服務中。從這裏開始,客戶發送他們的GUID作爲識別的一種手段。默認情況下WCF服務是無狀態的嗎?
因爲我在Dictionary/Hashmap中存儲了鍵/值對,所以這種方法只有在WCF服務是有狀態的時纔有效。問題是,它們是默認的狀態,還是有一些我必須做的使它們以這種方式行事?
按呼叫服務是Windows Communication Foundation默認實例化模式。所以,默認情況下,WCF服務不保持狀態。正如馬克所言,在WCF服務中保存狀態存在潛在的問題。我強烈建議聽取他的建議。
這個article描述了處理WCF實例管理的各種方法,包括如何維護你所要求的狀態。
Juval Lowy優秀的WCF服務編程(link)的第4章詳細介紹了更多細節。
我相信對於支持會話的渠道,默認是PerSession? – Jeremy 2011-05-18 20:46:30
我從Juval Lowy的文章中獲取了這些信息:http://msdn.microsoft.com/en-us/magazine/cc163590.aspx#S2 – 2011-05-18 20:48:14
有趣的是,我再次查找並得到了不同的答案:http:// msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode.aspx不知道哪一個是正確的:) – Jeremy 2011-05-18 21:16:40
默認情況下它們是無狀態的,我強烈建議儘可能保持這種狀態。但是如果由於某種原因你無法啓動,你可以啓用狀態。
您必須使用wsHttpBinding或wsDualHttpBinding,然後將ServiceContract的會話模式(MSDN link)設置爲允許或需要。 進入更多的細節。
WCF服務應該是無狀態的 - 使您免於許多棘手的問題和頭痛。被接受的「最佳實踐」是使用「每個呼叫」方法 - 每個呼叫是一個全新的獨立操作,完全獨立於之前的任何其他呼叫。 – 2011-05-18 20:24:08
@marc_s:我得到的服務確實是無狀態的,但我不確定如何存儲用於識別使用該服務的客戶端的鍵/值對。我應該將這些臨時值存儲在數據庫中而不是Dictionary/Hashmap中嗎? – rafale 2011-05-18 20:28:49
我只是將用戶名/密碼傳遞給每個呼叫。如果這太難以驗證每次:從第一次調用傳回一些標識符,並將該標識符存儲在「當前有效用戶」或類似的表中。在隨後的調用中,只需傳入該「標識符」並將其與「當前有效用戶」表進行覈對 – 2011-05-18 20:31:43