2010-01-26 53 views
10

我有多個共享某些數據協定並需要使用svcutil.exe生成客戶端代碼的WCF服務。我遇到了兩個最明顯的方法來做到這一點,並需要一些幫助。如何爲共享類型的多個WCF服務生成客戶端代碼

但首先,這裏的服務:

[ServiceContract(Namespace = "http://www.me.com/services/")] 
public interface IFooService { 
    [OperationContract] 
    Response RunFoo(Request request); 
} 
[ServiceContract(Namespace = "http://www.me.com/services/")] 
public interface IBarService { 
    [OperationContract] 
    Response RunBar(Request request); 
} 

響應和請求是在​​一個單獨的程序定義:

[DataContract(Namespace = "http://www.me.com/shared/")] 
public class Request { 
    [DataMember] 
    public int Input { get; set; } 
} 
[DataContract(Namespace = "http://www.me.com/shared/")] 
public class Response { 
    [DataMember] 
    public int Result { get; set; } 
} 

的服務在一些瑣碎的方式來實現,編譯,出版 - 讓我們現在切換到客戶端。

包括SvcUtil工具命令行這兩種服務 - 這樣的:

svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc 

將導致大約重複數據類型衆多的錯誤消息,從

Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 9087 Validation Error: The global element ' http://schemas.microsoft.com/2003/10/Serialization/:anyType ' has already been declared.

Error: There was a validation error on a schema generated during export: Source: Line: 1 Column: 12817 Validation Error: The complexType ' http://www.me.com/shared/:Response ' has already been declared.

結束

爲每項服務單獨生成一個客戶端文件避免š這些錯誤:

svcutil /o:Foo.cs http://hostname.com/FooService.svc 
svcutil /o:Bar.cs http://hostname.com/BarService.svc 

但隨後共享類型(如請求和響應)的定義將在Foo.cs然後在Bar.cs被複制,在編譯器錯誤明顯得到。

那麼,什麼是生成客戶端代碼消費這種服務的傳統方式

限制:

  • 不能船舶包含共享類型的客戶端(使他們能夠使用svcutil.exe的的/ r選項)
  • 不能使用「添加服務引用...」命令彙編在Visual Studio中 - 需要一個svcutil命令行(或另一個命令行工具)。

回答

5

好了,基本上就可以

  • 要麼把你的共享類型到一個單獨的組件生成的客戶端代碼(您已經解僱是不可能的)

或然後在客戶端可以使用:

  • 您必須分別爲服務生成每個代理,並且每個服務都將獲得自己的「請求」和「響應」類的「副本」

要麼你可以共享共同的組件 - 或者你不能 - 我沒有看到任何其他的選擇,真的。

+0

但它不是一個二者或情況。通過在命令行中指定多個端點爲svcutil,您可以生成一組輸出文件,以在多個服務中重複使用DTO。無需從服務端重新使用程序集,也不需要每個服務都擁有自己的相同對象的副本。 – Bevan 2010-11-29 22:20:36

4

既然你已經排除了一個共享的DTO組件(爲什麼,順便說一句?),在這種情況下最簡單的選項看起來是產生在不同的C#的命名空間的類型(即兩次調用svcutil),和映射兩者之間的數據。從根本上說:將兩種服務中的DTO視爲巧合相似。

你可以使用像automapper這樣的東西來減少工作量,或者你可以直接從A類序列化並反序列化到B類型(假設實際的數據數據等是相同的)。

+0

服務器端和客戶端是在不同的組織。所以,我必須向每個客戶端伸出手,併爲他們提供DLL或將其轉換爲可下載或開源產品。無論如何,這將涉及更多的人,並且比開發人員僅僅選擇正確的命令行選項組合更困難和昂貴的決定。 – azheglov 2010-01-26 20:35:53

0

當您運行客戶端實用程序後,您將獲得XXXXService.cs和output.config文件。

如果您觀察到XXXXService類,則您擁有文件中的所有內容。您可以將它們拆分爲單獨的IXXXService和XXXService文件以及datacontracts文件。

然後你可以運行第二服務的效用,並添加IXXXService1.cs和1XXXService.cs文件和相同的datacontracts你可以用它來共享這些2.

我不知道這是否可以回答你題。我有an example可以幫助你。 您可以看到一些與MVC和WCF相關的更多示例here

2

如果您還沒有找到解決方案,WSCF Blue可能會讓您更接近解決方案。

http://wscfblue.codeplex.com/

它可以產生不同的文件中的每個類型,並覆蓋上後續操作。

相關問題