2011-01-13 40 views
0

我已經寫了一個公開大量方法的WCF服務,它們中的每一個基本都是數據庫查詢。然而,有多個數據庫,所以現在每個方法都有第一個參數是數據庫的名稱。.NET WCF存儲沒有持久化或乾淨實現的會話數據

在客戶端,一個會話只使用一個數據庫,所以我不想在每次調用服務時都傳遞數據庫的名稱。理想情況下,我想先將數據庫名稱發送給服務,然後將其存儲在內存中以備將來查詢。問題是我的客戶端是用傳統的ASP編寫的,因此我使用的是basicHttpBinding,因此服務器上的調用沒有持久性。

我現在的問題是,是否有另一種方法,如果不是,我將如何實現這很好,所以我沒有每個方法簽名中的數據庫名稱。

我當然可以使用類似的命令模式,併爲每次調用創建包含neccessary數據(包括使用繼承數據庫名)的對象,但這樣會導致大量的類(服務器上在客戶端)。另一個選擇是使用一個字典,但然後我的服務器方法沒有指定它的參數,這使得難以維護。我想過使用反射,但這似乎有點矯枉過正...

有什麼建議嗎?

回答

0

我不知道任何WCF特定的解決方案。但是,您始終可以通過創建一種方法來解決此問題,該方法會在第一個請求中存儲客戶端標識和所需的數據庫,以便後續請求可以查詢該存儲。

0

您可以嘗試使用this sample來構建基於Cookie的會話 - ASMX也支持相同的會話。您的服務將能夠訪問ASP.NET會話,但它需要AspNetCompatibility。您還可以嘗試將其與自定義IInstanceProvider結合使用,並構建由Cookie控制的自定義會話管理。

0

如果所需的客戶端運行ASP我可能會去建議的AspNetSession解決方案。但是,如果您不能依賴AspNetSessions,那麼您可以依靠使用HTTP標題在每次調用中發送該信息。在第一次調用時,當定義數據庫時,服務器將直接從方法參數中獲取有關要採用哪個數據庫的信息,並將其存儲到HTTP標頭中。

OperationContext.Current.OutgoingMessageHeaders.Add(MessageHeader.CreateHeader(HEADER_NAME, NAMESPACE, yourDbName)); 

在經典的ASP中必須有一種方法來檢索這些信息,但我並不是這方面的專家。

http://www.w3schools.com/asp/coll_servervariables.asp

表明,你可以訪問它雖然。在隨後的所有調用中,客戶端再次將該標頭信息發送到服務器。

在服務器上

你做

int index = OperationContext.Current.IncomingMessageHeaders.FindHeader(HEADER_NAME, NAMESPACE) 
string yourDbName = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>(headerIndex); 

這樣閱讀你的服務器代碼沒有得到污染,可以自動的把和獲得的從報頭信息到自己的類,以便您的服務實現不知道信息來自哪裏。