2009-03-11 37 views
7

Tôi đã tò mò nếu ai đó có thể phác thảo các loại hợp đồng WCF (giao diện) thay đổi ở phía máy chủ sẽ phá vỡ một khách hàng đang cố gắng gửi tin nhắn, và tại sao. Tôi tin rằng WCF có thể xử lý sự khác biệt nhất định, nhưng tôi không chắc chắn chính xác những gì bạn có thể thay đổi một cách an toàn, và những gì bạn không thể.Thay đổi hợp đồng WCF ảnh hưởng đến khách hàng

  • Thêm/xóa thông số khỏi OperationContract?
  • Thêm/xóa/thay đổi thuộc tính được tuần tự hóa của DataContract?
  • Thêm/loại bỏ hoạt độngĐóng góp từ một ServiceContract?

Một người bạn hỏi một câu hỏi tương tự ở đây:

Does adding a method to a WCF ServiceContract break existing clients?

EDIT: Như John Saunders chỉ ra, thay đổi hợp đồng không phải là thường là một ý tưởng tốt, nhưng có những thứ được xây dựng trong đó cho phép một số dung sai phiên bản (ExtensionDataObject, v.v.). Tôi chỉ muốn biết mức độ linh hoạt của phiên bản là bao nhiêu.

Trả lời

12

Kiểm tra bài viết này trên dasBlonde: Versioning WCF Service Contracts

Nó liệt kê những thay đổi sẽ phá vỡ các khách hàng hiện có:

  1. Remove hoạt động
  2. Thay đổi tên hoạt động
  3. Remove hoạt động thông số
  4. Thêm hoạt động tham số
  5. Thay đổi thông số hoạt động Tên tài khoản hoặc kiểu dữ liệu
  6. Thay đổi của một hoạt động kiểu giá trị trả về
  7. Thay đổi định dạng XML serialized cho một loại tham số (hợp đồng dữ liệu) hoặc hoạt động (hợp đồng message) bằng cách sử dụng một cách rõ ràng NET thuộc tính hoặc tùy chỉnh mã serialization
  8. Sửa đổi dịch vụ định dạng mã hóa hoạt động (Mã hóa RPC so với Tài liệu văn bản)

This article by Michele giải thích chi tiết hơn cách bạn có thể thiết kế hợp đồng linh hoạt hơn. khuyến nghị

+0

Xin cảm ơn, đó chính xác là những gì tôi đang tìm kiếm –

+0

Nếu bạn cần thực hiện một trong những điều này, hãy [cập nhật khách hàng của bạn] (http://stackoverflow.com/a/40666352/4163002). Thật dễ dàng với VS2015. – ZX9

0

Tôi nghĩ thực tiễn tốt nhất là nghĩ về hợp đồng là hợp đồng không thể phá vỡ, hmmm, . Không thay đổi chúng sau khi chúng được xuất bản. Thật dễ dàng để tạo một hợp đồng mới với những thay đổi bạn muốn và để lộ hợp đồng mới trên điểm cuối mới.

+1

Tôi đồng ý với khái niệm chung về việc không thay đổi hợp đồng, nhưng nếu bạn thực hiện các thay đổi nhỏ đối với hợp đồng, tôi không biết có nên xuất bản điểm cuối mới cho mỗi hợp đồng mới hay không. Bất kỳ suy nghĩ về điều này? –

+1

Suy nghĩ của tôi là, "cho họ một inch, và họ sẽ mất một dặm". Đừng đi vào thói quen cho phép thay đổi "nhỏ", hoặc họ sẽ tạo ra những thay đổi lớn. –

4

Thiết kế cho các hợp đồng

  1. Đầu tiên phiên bản

    1,1. Cẩn thận chọn tên cho tất cả các hợp đồng (giao diện, phương thức, lớp và thuộc tính). Đây sẽ là khó khăn để thay đổi trong các phiên bản trong tương lai.

    1.2. Hãy nhớ rằng, sau đây không thể thay đổi trong tương lai: số tham số phương thức, loại tham số/giá trị trả về/thuộc tính cho các loại không thuộc quyền kiểm soát của bạn.

  2. Tiếp theo phiên bản

    2,1. Nếu đã tồn tại, không thay đổi không gian tên hoặc tham số tên trên bất kỳ xxxContractAttribute.

    2.2. Nếu đã tồn tại, đừng thay đổi thuộc tính Order của DataMemberAttribute.

    2.3. Chỉ thay đổi sau đây được phép:

    • phương thức Add (OperationContract) để giao tiếp (ServiceContract) phương pháp

    • Rename trên giao diện

    • Rename lớp (DataContract)

    • Thêm bất động sản (DataMember) đến lớp (DataContract)

    • Đổi tên thuộc tính trên lớp

    2.4. Bất kỳ việc xóa nào đều có khả năng tương thích.

    2.5. Bất kỳ thay đổi khác phá vỡ khả năng tương thích.

Dưới đây là vài liên kết hữu ích:

2

"Thêm/gỡ bỏ các thông số từ một OperationContract "trong WCF không phải luôn luôn là một cái gì đó có thể phá vỡ khách hàng của bạn, nhưng bạn phải biết những gì bạn làm. Cụ thể, việc thêm thông số mới vào hợp đồng hoạt động sẽ khiến khách hàng cũ không vượt qua được họ và bên dịch vụ họ sẽ được đặt bằng giá trị mặc định của họ. Hơn nữa, việc loại bỏ các tham số khỏi một hợp đồng hoạt động, sẽ bị tắt tiếng khỏi quan điểm của máy khách và chúng sẽ bị bỏ qua ở phía dịch vụ. Tất nhiên, việc thay đổi tên/kiểu của tham số sẽ khiến máy khách bị hỏng.

0

OK. Câu hỏi. Do cú pháp đặt tên sai (thông số được quy định với chữ cái viết hoa), tôi muốn điều chỉnh một số mã:

[OperationContract] 
public void Foo(string Bar){} 

để

[OperationContract] 
public void Foo(string bar){} 

Would điều chỉnh hợp đồng nghỉ vốn?

+2

có, nhưng nếu bạn chỉ muốn thanh chữ thường cho mục đích mã của bạn, tôi nghĩ bạn có thể tự trang trí thông số với [MessageParameter (Name = "Bar")], làm cho nó trông giống với khách hàng, nhưng khác với dịch vụ của bạn trong nội bộ. – Jeremy

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