2009-09-17 26 views
16

在使用WCF和OperationContracts我已經定義了下列方法:如何強制WCF自動生成具有所需方法參數的WSDL(minoccurs =「1」)?

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

當這個被翻譯成由WCF運行時一個WSDL,它與一個minOccurs =「0」中列出的參數someId和messageData結束(並且如果這些參數丟失,則會引發運行時錯誤)。

如果我生成使用了SoapUI我得到的東西看起來像這樣的代理:

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

在MyComplexType id字段被標記使用IsRequired =「真DataMemeber屬性「因此暴露爲強制性的。

WSDL指定一個參數是可選的,但是我看不出任何顯而易見的方式來標記OperationContract,迫使WCF根據需要識別並公開這些參數。

我有點困惑,似乎沒有一個明顯的方式來做到這一點(閱讀intellisense/MSDN /谷歌)。或者我會失明,忽視明顯的事物。

任何線索?

+0

我發現這個Microsoft連接問題https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx ?FeedbackID = 482144這意味着這可能是不可能的。 這很糟糕。 – DavidWhitney 2009-09-17 12:55:37

+0

隨着進一步思考,看起來好像參數被列爲minoccurs =「0」,因爲類型本身可能爲空,因此,如果有人提供了null,它仍然會匹配方法sig。 對於WSDL生成和定義與調用應用程序/組織的合同仍然沒有幫助。 – DavidWhitney 2009-09-17 13:00:14

+0

生成的WSDL不受影響,因爲類型可能爲空(引用類型與值類型)。如果省略了值類型,則將使用該值類型的默認值。不過,請參閱下面的答案。 – Thorarin 2010-08-08 21:18:39

回答

17

我剛剛寫了一個Blog post關於這個問題,因爲我上週自己遇到了這個問題。 它解釋瞭如何修改WCF在運行時生成的元數據。

除了下載源文件,您只需要爲您的合同定義添加一個屬性。像這樣:

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

這裏的解釋比較詳細的博客文章:Controlling WSDL minOccurs with WCF

+0

有趣的方法。你能告訴我,這是否適用於所有類型(由參考元帥和價值元帥)?我知道可空類型傾向於在生成的xsd中讀取爲挑戰...我想知道這是否也適用於您正在執行的操作。假設我傳遞了幾個必需的'字符串'參數。 – 2013-10-14 11:32:39

0

檢查MyComplexType是否標有[DataContract]屬性。

對於我自己的WCF合同,我發現minOccurs = 1在生成的wsdl中不會顯示IsRequired = true,直到合同中涉及的整個對象鏈被標記爲這樣。

+0

這是多麼奇怪。 – DavidWhitney 2014-04-06 17:53:44

相關問題