2012-07-02 12 views
9

Nếu hợp đồng của tôi trông như sau:Làm cách nào để ngăn chặn tham số ngoài kết thúc tham số trả về trong dịch vụ web WCF?

[OperationContract] 
void DoSomething(int id, out string moreInfo); 

này kết thúc lên trông như:

string DoSomething(int id); 

khi bạn nhập một tài liệu tham khảo dịch vụ web. Có thể ảnh hưởng đến việc tự động chuyển đổi thứ tự của các tham số không? Thật bất ngờ khi tìm ra tất cả các tham số ở đầu chữ ký hàm, nhưng vẫn còn khả thi, nhưng chúng tôi muốn các phương thức void để tiếp tục là các phương thức void. Hay đây là một hạn chế SOAP?

+1

Trong trường hợp này, một phương thức void với một tham số 'out' duy nhất là một phương thức không có hiệu lực với giá trị trả về đúng. Điều gì định nghĩa một tham số 'out' cho bạn rằng phiên bản không xuất hiện không? –

+0

@AdamHouldsworth trực giao trong thiết kế dịch vụ web. Ban đầu chúng tôi có các dịch vụ trả về một giá trị và những dịch vụ không có giá trị. Tuy nhiên, mỗi dịch vụ được tái cấu trúc để trả về trạng thái. Bằng cách buộc tham số phụ, việc xây dựng sẽ tự động thất bại và chúng tôi biết điều gì cần sửa ở đâu, cộng với việc thuận tiện để luôn biết rằng tham số đầu tiên là một tham số có chứa trạng thái, bất kể phần còn lại của hợp đồng. – Abel

+3

Tôi thực sự rất ngạc nhiên và ấn tượng rằng WCF đã có thể tạo ra một proxy cho hoạt động đó ở tất cả! Lý do để sử dụng tham số 'out' ở vị trí đầu tiên là gì? – MattDavey

Trả lời

4

Nó dường như được dựa trên một giới hạn WSDL: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/48b5992f-f7bd-4b67-8299-514d1780fa9a

WSDL không hiển thị các phương pháp chữ ký gốc; thay vào đó, nó hiển thị tham số đầu vào dưới dạng nhóm và tham số đầu ra như một nhóm khác.

Giới hạn không thể tách riêng các giá trị trả lại từ các tham số ngoài là trong WSDL. Nhưng điều đó có nghĩa là giới hạn của một phương thức void sẽ là một phần của svcutil.exe mà tôi nghĩ. Không có lý do tại sao không thể có một chuyển đổi trên svcutil để không di chuyển đầu ra đầu tiên đến một giá trị trả về, nhưng đó sẽ là một yêu cầu cho một tính năng trên ms kết nối.

Thay vì bỏ trống, bạn có thể trả về trạng thái đơn giản hoặc bool nếu vấn đề của bạn là nhất quán, nhưng tôi chắc chắn đó không phải là câu trả lời hoàn hảo nếu bạn đã có hàng tá phương pháp.

+1

Tôi đã xảy ra trên cùng một liên kết cách đây vài phút. Thật vậy, nó là một hạn chế của WSDL cơ bản, có vẻ như vậy. Các wrapper có thể sử dụng, tất nhiên, bất kỳ thứ tự, nhưng tôi không thấy một trường hợp sử dụng để buộc điều đó. Chúng tôi sẽ làm việc xung quanh những hạn chế, sau đó, ít nhất chúng tôi sẽ sử dụng một loại VoidResponse để làm cho tái cấu trúc dễ dàng hơn trong thời gian này. – Abel

+0

Ý tưởng tốt về loại VoidResponse. –