我有多個共享某些數據協定並需要使用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命令行(或另一個命令行工具)。
但它不是一個二者或情況。通過在命令行中指定多個端點爲svcutil,您可以生成一組輸出文件,以在多個服務中重複使用DTO。無需從服務端重新使用程序集,也不需要每個服務都擁有自己的相同對象的副本。 – Bevan 2010-11-29 22:20:36