我如何强制WCF自动生成具有所需方法参数的WSDL(minoccurs =“1”)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

在使用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 /谷歌)。或者我会失明,忽视明显的事物。

任何线索?

提问于
用户回答回答于

我刚刚写了一篇关于这个主题的博文,因为我上周自己遇到了这个问题。它解释了如何修改WCF在运行时生成的元数据。

除了下载源文件之外,只需要在合约定义中添加一个属性即可。像这样:

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

以下是更详细地解释它的博客文章:使用WCF控制WSDL minOccurs

用户回答回答于

检查MyComplexType是否标有[DataContract]属性。

对于我自己的WCF合同,我发现minOccurs = 1在生成的wsdl中不会显示为IsRequired = true,直到合同中涉及的整个对象链被标记为这样。

扫码关注云+社区