在使用WCF和OperationContracts时,我定义了以下方法: [OperationContract] [FaultContract(typeof(ValidationFault))] [FaultContract(typeof(FaultExceptionExceptionDetail))] int DoSomething(int someId, MyComplexType messageData); 当
[OperationContract] [FaultContract(typeof(ValidationFault))] [FaultContract(typeof(FaultException<ExceptionDetail>))] int DoSomething(int someId, MyComplexType messageData);
当WCF运行时将其转换为WSDL时,最终会为参数someId和messageData列出minoccurs =“0”(并且如果缺少这些参数,则会抛出运行时错误).
如果我使用SoapUI生成代理,我会得到如下所示的东西:
<com:DoSomething> <!--Optional--> <com:EventId>1</com:EventId> <!--Optional--> <com:myComplexType > <com:id>1</com:id> </com:myComplexType > </com:DoSomething>
MyComplexType中的id字段使用IsRequired =“true”的DataMemeber属性标记,因此被暴露为强制性.
当WSDL指定一个参数是可选的时,WSDL显然是非常误导的,但是我看不到任何明显的方法来标记OperationContract,以强制WCF根据需要识别和公开这些参数.
我有点困惑,似乎没有明显的方法这样做(阅读intellisense / msdn / google).或者我会失明,俯瞰一些明显的东西.
任何线索?
我刚刚写了一个关于这个问题的 Blog post,因为我上周遇到了这个问题.它解释了如何修改WCF在运行时生成的元数据.
除了下载源文件,您只需要在合同定义中添加一个属性.像这样:
[ServiceContract] [RequiredParametersBehavior] public interface ICalculatorService { [OperationContract] int Add(int firstValue, int secondValue); }
这是博客文章,更详细地解释了:Controlling WSDL minOccurs with WCF