2009-11-17 8 views
6

Cách tốt nhất để xử lý việc thêm tham số mới (tùy chọn) vào một hoạt động hiện tại mà không yêu cầu máy khách cập nhật WSDL của họ là gì? Tôi không muốn cập nhật không gian tên để mô tả một phiên bản mới của các hợp đồng dịch vụ, vì điều này sẽ tương thích ngược với các máy khách cũ hơn.Thêm tham số mới vào hoạt động WCF: lựa chọn?

Tôi có nên thêm hoạt động mới có thông số mới làm quá tải không? Hoặc tôi nên thêm tham số vào hoạt động hiện tại?

Đây là hoạt động của tôi:

[OperationContract] 
MyResponse GetData(); 

nó nên là:

[OperationContract] 
MyResponse GetData(); 

[OperationContract] 
MyResponse GetData(string filter); 

Hoặc đơn giản hơn, chỉ cần thay đổi nó như thế này:

[OperationContract] 
MyResponse GetData(string filter); 

Lựa chọn thứ hai có vẻ tốt nhất, và theo cuốn sách tham khảo của tôi, "Tác động trên máy khách là không có. Các thông số mới được khởi tạo tới các giá trị mặc định tại dịch vụ. "WCF có khởi tạo giá trị mặc định không? Nếu có, giá trị mặc định là gì? Nếu bạn có giá trị mặc định?

Trả lời

13

Một điều cần lưu ý là bạn không thể có hai OperationContracts có cùng tên.Cách nó được tuần tự hóa nó sẽ ném một lỗi.

Cách tiếp cận tốt nhất là đi với tùy chọn 3 (chỉ thêm tham số mới) và trong tài khoản logic phương thức cho nó là giá trị null cho những khách hàng chưa cập nhật. Nếu đó là một thay đổi đột phá mà khách hàng sẽ cần phải cập nhật, hãy đảm bảo không có toàn bộ ứng dụng chết vì ngoại lệ.

+2

Đó là một thay đổi không phá vỡ. Tôi sẽ xử lý nếu bộ lọc rỗng hoặc rỗng một cách duyên dáng. –

+0

@Mike: Tôi không nghĩ rằng nó không vi phạm - đột nhiên, phương pháp "GetData" của bạn bây giờ mong đợi một tham số không được cung cấp bởi người gọi ban đầu .... –

+2

@marc_s: do tính linh hoạt của WCF lâu tại giá trị có thể là null, một khách hàng không truyền đạt thứ gì đó cho nó sẽ vẫn hoạt động. Đó là lợi thế của việc cho phép phiên bản không khớp trong WCF. –

2

Vâng, thay đổi hợp đồng hiện tại sau khi được sử dụng thực sự chống lại tất cả các quy tắc hướng dịch vụ; bao giờ phá vỡ hợp đồng hiện có.

Trên thực tế, điều này xảy ra khá thường xuyên, và WCF là khá tốt về xử lý điều đó cho bạn. chừng nào bạn chỉ giới thiệu những thay đổi không bị phá hủy, khách hàng hiện tại sẽ tiếp tục làm việc.

Điều này có thể là:

  • hợp đồng hoạt động mới trên một hợp đồng dịch vụ hiện có
  • một lĩnh vực mới không cần thiết trên một DataContract

gì bạn đang cố gắng làm là không đi làm, mặc dù

  1. bạn không thể có hai phương thức có cùng tên trong WCF - WCF là không phải là .NET và bạn không thể có hai phương thức bằng cùng một tên chỉ khác nhau bằng chữ ký của chúng. Không hoạt động. Bạn sẽ cần phải sử dụng hai tên riêng biệt, riêng biệt. Hãy nhớ rằng: các cuộc gọi phương thức WCF của bạn sẽ được dịch sang tài liệu WSDL (ngôn ngữ mô tả dịch vụ web) để mô tả dịch vụ - và WSDL chỉ đơn giản là không hỗ trợ có hai hoạt động có cùng tên - chỉ khác biệt về chữ ký không được hỗ trợ và sẽ không hoạt động .

  2. bạn không thể thay đổi hợp đồng hiện tại, ví dụ: bạn không thể giới thiệu một tham số mới vào một cuộc gọi phương thức sau khi thực tế, mà không vi phạm hợp đồng.

Vì vậy, những gì bạn thực sự cần phải làm là:

[OperationContract] 
MyResponse GetData(); 

[OperationContract] 
MyResponse GetFilteredData(string filter); 

Bất kỳ sự thay đổi khác mà bạn đề nghị sẽ a) phá vỡ hợp đồng, hoặc b) chỉ đơn giản là không làm việc trong WCF:

+0

Tôi thực sự đã đi với đề nghị của bạn, nhưng câu trả lời Agent_9191 là chính xác hơn về câu hỏi ban đầu của tôi, vì vậy tôi chấp nhận câu trả lời của mình và +1 của bạn. –

3

bạn có thể thử này:

[OperationContract] 
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")] 
MyResponse GetData(string filter);