在使用WCF和OperationContracts时,我定义了以下方法:
[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指定参数是可选的显然是非常误导,但我看不到任何明显的方法来标记OperationContract以强制WCF根据需要识别和公开这些参数。
我有些困惑,似乎没有一种明显的方法可以做到这一点(阅读intellisense / msdn / google)。或者我会失明并忽略一些显而易见的事情。
任何线索?
答案 0 :(得分:18)
我刚刚写了一篇关于这个主题的Blog post,因为我上周遇到了这个问题。 它解释了如何修改WCF在运行时生成的元数据。
除了下载源文件外,您只需要在合同定义中添加一个属性。像这样:
[ServiceContract]
[RequiredParametersBehavior]
public interface ICalculatorService
{
[OperationContract]
int Add(int firstValue, int secondValue);
}
以下是更详细解释的博客文章:Controlling WSDL minOccurs with WCF
答案 1 :(得分:0)
检查MyComplexType是否标有[DataContract]属性。
对于我自己的WCF合同,我发现在生成的wsdl中,minOccurs = 1不会出现IsRequired = true,直到合同中涉及的整个对象链被标记为这样。