Tôi có nhiều dịch vụ WCF chia sẻ một số hợp đồng dữ liệu và cần tạo mã phía máy khách bằng svcutil.exe. Tôi đã gặp lỗi khi sử dụng hai cách rõ ràng nhất để thực hiện việc này và cần trợ giúp.Cách tạo mã phía máy khách cho nhiều dịch vụ WCF với các kiểu chia sẻ
Nhưng trước tiên, sau đây là các dịch vụ:
[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);
}
đáp ứng và yêu cầu được quy định tại một hội đồng riêng biệt:
[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; }
}
Các dịch vụ được thực hiện theo một cách tầm thường, biên soạn, xuất bản - chúng ta hãy chuyển sang phía máy khách ngay bây giờ.
Bao gồm cả các dịch vụ trên dòng lệnh svcutil - như thế này:
svcutil /o:Client.cs http://hostname.com/FooService.svc http://hostname.com/BarService.svc
sẽ dẫn đến rất nhiều thông báo lỗi về kiểu dữ liệu lặp lại, bắt đầu với
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.
và kết thúc với
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.
Tạo tệp khách hàng riêng biệt cho từng dịch vụ tránh s các lỗi này:
svcutil /o:Foo.cs http://hostname.com/FooService.svc
svcutil /o:Bar.cs http://hostname.com/BarService.svc
Nhưng sau đó định nghĩa của các loại được chia sẻ (như Yêu cầu và phản hồi) sẽ được nhân đôi trong Foo.cs và sau đó trong Bar.cs, dẫn đến lỗi trình biên dịch.
Vì vậy, cách thông thường để tạo mã phía máy khách tiêu thụ các dịch vụ như vậy là gì?
Hạn chế:
- không thể xuất xưởng một hội đồng có chứa các loại chia sẻ cho khách hàng (để họ có thể sử dụng của svcutil.exe/r tùy chọn)
- không thể sử dụng "Add Service Reference ..." lệnh trong Visual Studio - cần một dòng lệnh svcutil (hoặc một công cụ dòng lệnh khác).
Nhưng nó không phải là một trong hai tình huống. Bằng cách chỉ định nhiều điểm cuối cho svcutil trên dòng lệnh, bạn có thể tạo MỘT bộ tệp đầu ra sử dụng lại DTO trên nhiều dịch vụ. Không cần phải tái sử dụng lắp ráp từ phía dịch vụ, và không cần cho mỗi dịch vụ để có bản sao của chính nó của các đối tượng tương tự. – Bevan