2010-02-18 61 views
2

我有兩個邏輯上不同的WCF服務,我希望將它們分開。他們每個人都有一個返回相同數據合同的操作。一個Silverlight客戶端同時使用這兩種服務。當我在Silverlight客戶端中將服務引用添加到每個服務時,單個數據合同在生成的代碼中結束兩次。兩種服務引用是否可以使用數據契約的相同定義?兩個WCF服務將相同的數據協定返回給silverlight客戶端

從我讀過的,對於非silverlight客戶端來說,可以通過將datacontracts編譯爲由服務器和客戶端引用的單獨程序集來實現。然而,Silverlight無法實現這一點(至少在Silverlight 3中)。

感謝,
羅布

回答

1

您是否嘗試過使用svcutil生成客戶端?如果您提供多個服務端點,它們都可以正常工作,但會產生大量生成客戶端的錯誤。

2

了Stian,

感謝您的快速回復。我觀看了米格爾卡斯特羅的截屏視頻,內容非常豐富。不幸的是它並沒有涵蓋銀光的情況。然而,以此爲起點,我能夠得到一些其他人可能認爲有用的工作。

創建兩個程序集:ServerDataContracts和SilverlightDataContracts(這是一個Silverlight程序集)。在每個人的AssemblyInfo.cs中添加以下行:

[assembly: ContractNamespace("http://YourNamespaceUri", 
ClrNamespace = "YourDataContractsNamespace")] 

所有DataContracts添加到ServerDataContracts組裝。在SilverlightDataContracts程序集中,右鍵單擊項目(或子文件夾)並選擇「添加現有項目」。瀏覽到ServerDataContracts程序集中的DataContracts並選擇要添加的那些。不要打「添加」!請點擊「添加」旁邊的向下箭頭,然後選擇「添加爲鏈接」。這將SilverlightDataContracts項目鏈接到ServerDataContracts項目中的現有文件。現在,當你編輯一個項目時,兩個項目都會得到改變。當您編譯時,這些項目會分別編譯它們的正確目標。

現在添加ServerDataContracts程序集作爲您的服務合同項目的參考。對您的SilverlightDataContracts程序集執行Silverlight應用程序也是如此。當您將Silverlight客戶端的服務引用添加到服務時,它不應該生成數據合同。它應該使用你的程序集中的。

我已經得到了這個工作,但它仍然缺少生成的datacontract類提供的一些功能。生成的類實現INotifyPropertyChanged,在silverlight/wpf中進行數據綁定時非常有用。雖然您可以自己實現這一點,但是這是相當乏味的,現在您的服務器代碼必須在每個屬性集上執行所有這些事件處理程序,即使您可能永遠不會訂閱服務器上的PropertyChanged事件。

我仍然在尋找一種更清潔的方式來處理這個問題。它看起來像silverlight 4將使這更容易,因爲您可以在客戶端和服務器中使用相同的程序集(編譯代碼是兼容的)。不幸的是,這對我的需求來說太遙遠了。

+1

這應該是真的被添加到您的問題作爲額外的信息。 – ChrisF 2010-02-18 22:23:54

0

這是令人討厭的,但它的工作。我有一項主要服務和幾項支持服務。所有數據合同所屬的主要服務,支持服務應重用主服務中指定的數據合同。

我創建了silverlight程序集,僅用作主要服務的客戶端。然後我有我的Silverlight應用程序參考它。然後在silverlight應用程序中,我添加了我的支持服務。在添加支持服務時,高級屏幕允許您指定是否應該在引用的程序集中重用類型。它默認開啓。由於主要服務是在引用程序集中指定的,所有支持服務都使用主要服務中的數據合同。

這不是很漂亮,但它的工作原理。

+1

您應該使用更多信息編輯您的問題,或只發佈一個答案。堆棧溢出不是一個傳統的論壇,它是一個問答網站,所以你沒有像在論壇中那樣進行對話。 – ChrisF 2010-02-18 22:22:08

相關問題