2009-03-10 20 views
11

Chúng tôi có một ServiceContract hiệnViệc thêm phương thức vào WCF ServiceContract có phá vỡ các máy khách hiện tại không?

[ServiceContract(Namespace = "http://somesite.com/ConversationService")] 
public interface IConversationService 
{ 
     [OperationContract(IsOneWay = true)] 
     void ProcessMessage(Message message); 

     [OperationContract(IsOneWay = true)] 
     void ProcessMessageResult(MessageResult result); 
} 

và chúng ta cần thêm một phương pháp để nó

[ServiceContract(Namespace = "http://somesite.com/ConversationService")] 
public interface IConversationService 
{ 
     [OperationContract(IsOneWay = true)] 
     void ProcessMessage(Message message); 

     [OperationContract(IsOneWay = true)] 
     void ProcessMessageResult(MessageResult result); 

     [OperationContract(IsOneWay = true)] 
     void ProcessBlastMessage(BlastMessage blastMessage); 
} 

này sẽ phá vỡ bất kỳ khách hàng WCF hiện đang sử dụng dịch vụ này? Hoặc chúng ta sẽ phải cập nhật tất cả các máy khách wcf hiện tại?

EDIT: Dịch vụ này được sử dụng cả hai netTcpBinding và netMsmqBinding

+0

Bạn nên chỉnh sửa câu hỏi để phản ánh rằng bạn quan tâm đến ràng buộc giao thức net.tcp và net.msmq. –

Trả lời

8

Tôi nghĩ rằng khách hàng hiện tại của bạn sẽ tiếp tục làm việc. Sau khi tất cả điều này là rất giống với SOAP và các dịch vụ web trong đó khách hàng sẽ kết nối với URL đã cho và yêu cầu một dịch vụ cụ thể. Nếu bạn có phương pháp đi, bạn sẽ có nguy cơ vỡ (chỉ khi phương pháp được sử dụng tôi tin) nhưng thêm nên đau miễn phí.

Tôi đã chỉ chơi trong WCF nhưng đã sử dụng dịch vụ web ASP.NET theo cách này để thành công lớn.

+1

+1 Điều này đúng. –

+0

@ lazarus, tôi đồng ý với bạn, ngoại trừ mọi trải nghiệm tôi từng có với việc sửa đổi các kết quả dịch vụ WCF bị vỡ (thêm hợp đồng hoạt động mới, thêm các tham số tùy chọn). Dịch vụ web ASP.NET hoạt động khá khác nhau và dường như ít bị hạn chế hơn. –

+0

@ andrew-hare [Cần dẫn nguồn] –

1

Nói chung, thêm vào thư trong các giải pháp SOA không phá vỡ hợp đồng. Tôi tin rằng miễn là bạn không sử dụng giao thức nhị phân (net.tcp), bạn sẽ duy trì tính tương thích ngược.

Tôi không chắc chắn về việc nó có làm hỏng khách hàng của bạn bằng cách sử dụng các ràng buộc nhị phân không?

+0

Vâng, đó là một trong những điều tôi lo lắng. Chúng ta có cả ràng buộc netMsmqBinding và netTcpBinding – Nick

4

Không, tôi không ngờ rằng - thêm chức năng mới/phương pháp dịch vụ mới NOT thay đổi bất kỳ phương thức/cuộc gọi chức năng hiện tại nào sẽ không ảnh hưởng đến khách hàng "cũ". Tất nhiên, họ sẽ không biết về các phương pháp mới cho đến khi proxy của họ đã được tái tạo từ siêu dữ liệu hoặc được điều chỉnh theo cách thủ công.

Nhưng cuộc gọi hiện tại sẽ không bị ảnh hưởng, miễn là chữ ký của họ (dữ liệu mà họ trao đổi) vẫn giữ nguyên.

Marc

1

Tôi có cái nhìn cực đoan hơn về điều này. Tại sao lại thay đổi bất cứ điều gì? Thay vào đó, tại sao không tạo hợp đồng mới, kế thừa từ cũ và thêm hoạt động mới? Hợp đồng mới có thể được tiếp xúc trong một điểm cuối riêng biệt trong cùng một dịch vụ.

Có thể là hoang tưởng không được chứng minh bằng bằng chứng chính thức, nhưng dường như tôi có thể xây dựng một khách hàng có thể cho biết sự khác biệt, có thể một số khách hàng sẽ "phá vỡ" khi bạn thực hiện thay đổi. Hãy xem xét rằng, khi bạn thay đổi hợp đồng dịch vụ, bạn không chỉ thay đổi mã dịch vụ - bạn đang thay đổi mã proxy trong bất kỳ ứng dụng khách nào xảy ra để cập nhật tham chiếu dịch vụ của mình. Một số khách hàng bảo thủ hơn, có thể xem xét một lý do để kiểm tra lại mã khách hàng của họ - sau khi tất cả, họ cũng có thể có các quy tắc cho biết họ phải kiểm tra lại mã của họ bất cứ khi nào có thay đổi.

Máy khách hiện tại sẽ đề cập đến điểm cuối ban đầu, do đó sẽ không bị ảnh hưởng khi thêm điểm cuối mới - không có mã nào thay đổi nếu "Cập nhật dịch vụ cập nhật" được thực hiện.

Bên cạnh đó, tại sao ngay cả nghĩ rằng về việc đó, nếu bạn không phải làm như vậy?

+0

Sẽ không kế thừa từ nguyên nhân cũ để tạo một nút cấu hình dịch vụ mới và một mục mới trong tệp .svc? Tôi nghĩ rằng (giá trị tên) phải là Namespace.ClassName của lớp thực hiện của hợp đồng, mà trong trường hợp này sẽ là lớp dẫn xuất không phải là lớp cơ sở. Do đó có vẻ như việc đặt hợp đồng có nguồn gốc trong cùng một dịch vụ sẽ không hoạt động. Nếu tôi sai, bạn có thể cung cấp một ví dụ về điều này không? Lỗi của tôi là: Không thể tìm thấy tên hợp đồng 'Namespace.IDerivedInterface' trong danh sách các hợp đồng được thực hiện bởi dịch vụ 'Namespace.BaseClass' – EbbnFlow

0

Tôi vừa thử nghiệm ứng dụng này với ứng dụng khách WCF Ứng dụng Windows (UWP) và tiếp tục hoạt động sau khi cập nhật ứng dụng dịch vụ WCF.Vì vậy, no: như đã trả lời trước đây, khách hàng của bạn sẽ không bị ngắt khi bạn thêm phương thức.

Tôi nghĩ đó là đáng nói, tuy nhiên, cách dễ dàng là để cập nhật cho khách hàng dịch vụ của bạn với Visual Studio 2015:

  1. Hãy chắc chắn rằng dịch vụ WFC của bạn đang chạy.

  2. Đơn giản chỉ cần đi đến Solution Explorer,

  3. Mở rộng Service References

  4. Nhấp chuột phải vào tài liệu tham khảo dịch vụ của bạn

  5. Bấm Update Service Reference

  6. Nếu bạn nhận được một thông báo lỗi, lặp lại bước cuối cùng. Tôi đã phải thử một vài lần vì lý do nào đó.

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