2010-01-26 34 views
10

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).

Trả lời

5

Vâng, về cơ bản bạn có thể

  • hoặc đặt các loại chia sẻ của bạn thành một hội đồng riêng biệt mà khách hàng có thể sử dụng khi tạo mã khách hàng (mà bạn đã bỏ như bất khả thi)

hoặc sau đó :

  • bạn phải tạo riêng từng proxy cho các dịch vụ và mỗi dịch vụ sẽ có "bản sao" riêng của các lớp "Yêu cầu" và "Phản hồi"

Hoặc bạn có thể chia sẻ lắp ráp thông thường - hoặc bạn không thể - Tôi không thấy bất kỳ lựa chọn nào khác, thực sự.

+0

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

4

Vì bạn có những quy định ra một hội đồng DTO chia sẻ (tại sao, btw?), Tùy chọn đơn giản nhất trong trường hợp này trông là để tạo ra các loại trong khác nhau C# không gian tên (tức là hai cuộc gọi đến svcutil), và ánh xạ dữ liệu giữa hai. Về cơ bản: xử lý các DTO từ hai dịch vụ tương tự như nhau.

Bạn có thể sử dụng những thứ như tự động hóa để giảm công việc hoặc bạn có thể nối tiếp theo loại A và deserialize thành loại B (giả sử dữ liệu không gian tên giống nhau).

+0

Máy chủ và khách hàng ở các tổ chức khác nhau. Vì vậy, tôi phải liên hệ với mọi khách hàng và cung cấp cho họ DLL hoặc biến nó thành sản phẩm có thể tải xuống hoặc nguồn mở. Trong mọi trường hợp, điều đó sẽ liên quan đến nhiều người hơn và là một quyết định khó khăn và tốn kém hơn khi một nhà phát triển chỉ cần chọn kết hợp đúng các tùy chọn dòng lệnh. – azheglov

0

Khi bạn chạy tiện ích máy khách khi bạn sẽ nhận được tệp XXXXService.cs và tệp output.config.

Nếu bạn quan sát lớp XXXXService bạn có mọi thứ trong tệp. Bạn có thể tách chúng thành một tệp IXXXService và XXXService riêng biệt và tệp dữ liệu datacontracts.

Sau đó, bạn có thể chạy các tiện ích cho dịch vụ thứ hai và thêm IXXXService1.cs và tập tin 1XXXService.cs và DataContracts cùng bạn có thể sử dụng để chia sẻ cho những 2.

Tôi không chắc chắn nếu điều này có thể trả lời của bạn câu hỏi. Tôi đã có an example có thể giúp bạn. Bạn có thể xem một số ví dụ khác here liên quan đến một số nội dung của MVC và WCF.

2

WSCF Blue có thể đưa bạn đến gần hơn với giải pháp nếu bạn chưa tìm thấy giải pháp.

http://wscfblue.codeplex.com/

Nó có thể tạo ra tập tin riêng biệt cho từng loại, ghi đè vào các hoạt động tiếp theo.

Các vấn đề liên quan