2009-09-17 12 views
16

Trong khi sử dụng WCF và OperationContracts Tôi đã phương pháp sau được xác định:Làm cách nào để buộc WCF tự động tạo WSDL với các tham số phương thức bắt buộc (minoccurs = "1")?

[OperationContract] 
    [FaultContract(typeof(ValidationFault))] 
    [FaultContract(typeof(FaultException<ExceptionDetail>))] 
    int DoSomething(int someId, MyComplexType messageData); 

Khi điều này được dịch sang một WSDL bởi thời gian chạy WCF, nó kết thúc với với minOccurs = "0" được liệt kê cho các thông số someId và messageData (và sau đó ném một lỗi thời gian chạy nếu các tham số này bị thiếu).

Nếu tôi tạo ra một proxy sử dụng soapUI tôi nhận được cái gì đó trông như thế này:

<com:DoSomething> 
    <!--Optional--> 
    <com:EventId>1</com:EventId> 
    <!--Optional--> 
    <com:myComplexType > 
     <com:id>1</com:id> 
    </com:myComplexType > 
    </com:DoSomething> 

Trường id trong MyComplexType được đánh dấu với DataMemeber thuộc tính sử dụng isRequired = "true "và do đó được tiếp xúc là bắt buộc. Rõ ràng là khá gây nhầm lẫn cho WSDL để xác định rằng một tham số là tùy chọn khi nó không phải là, nhưng tôi không thể thấy bất kỳ cách rõ ràng nào để đánh dấu OperationContract để buộc WCF nhận ra và phơi bày các tham số này theo yêu cầu.

Tôi hơi bối rối vì dường như không có cách nào rõ ràng để thực hiện việc này (đọc intellisense/msdn/google). Hoặc tôi sẽ mù và nhìn thấy một cái gì đó hiển nhiên.

Bất kỳ manh mối nào?

+0

tôi đã tìm thấy vấn đề này Microsoft Connect https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx ? FeedbackID = 482144 ngụ ý điều này có thể không thực hiện được. Điều hút. – DavidWhitney

+0

Với suy nghĩ thêm, nó xuất hiện như thể các tham số được liệt kê là minoccurs = "0" vì các kiểu tự có thể là null, do đó, nếu ai đó cung cấp một giá trị null, nó vẫn khớp với phương thức sig. Vẫn không giúp ích cho các mục đích tạo WSDL và xác định hợp đồng với ứng dụng/tổ chức gọi điện. – DavidWhitney

+0

WSDL được tạo không bị ảnh hưởng bởi vì loại có thể là null (các loại tham chiếu so với các loại giá trị). Nếu loại giá trị bị bỏ qua, giá trị mặc định cho loại giá trị đó sẽ được sử dụng. Xem câu trả lời của tôi dưới đây tuy nhiên. – Thorarin

Trả lời

17

Tôi vừa mới viết một số Blog post về chủ đề này, khi tôi tự mình gặp sự cố vào tuần trước. Nó giải thích cách bạn có thể sửa đổi siêu dữ liệu mà WCF tạo ra khi chạy.

Ngoài việc tải xuống tệp nguồn, bạn chỉ cần thêm thuộc tính vào định nghĩa hợp đồng của mình. Cũng giống như vậy:

[ServiceContract] 
[RequiredParametersBehavior] 
public interface ICalculatorService 
{ 
    [OperationContract] 
    int Add(int firstValue, int secondValue); 
} 

Đây là Blog bài giải thích nó một cách chi tiết hơn: Controlling WSDL minOccurs with WCF

+0

Cách tiếp cận thú vị. Bạn có thể cho tôi biết nếu điều này làm việc với tất cả các loại (nguyên soái bằng cách tham chiếu và nguyên soái theo giá trị)? Tôi biết rằng các loại nullable có xu hướng đọc lên như những thách thức trong xsd tạo ra ... Tôi tự hỏi nếu điều này áp dụng cho những gì bạn đang làm là tốt. Nói rằng tôi đã đi qua một số yêu cầu 'chuỗi' tham số. –

0

Kiểm tra xem MyComplexType có được đánh dấu bằng thuộc tính [DataContract] hay không.

Đối với hợp đồng WCF của riêng tôi, tôi thấy rằng minOccurs = 1 sẽ không hiển thị cho IsRequired = true trong wsdl được tạo cho đến khi toàn bộ chuỗi đối tượng liên quan đến hợp đồng được đánh dấu như vậy.

+0

lạ đến mức nào. – DavidWhitney