代码之家  ›  专栏  ›  技术社区  ›  DavidWhitney

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

  •  16
  • DavidWhitney  · 技术社区  · 15 年前

    在使用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)。或者我会失明,忽略一些显而易见的事情。

    2 回复  |  直到 15 年前
        1
  •  18
  •   Thorarin    14 年前

    Blog post 关于这个问题,上周我自己也遇到了这个问题。 它解释了如何修改WCF在运行时生成的元数据。

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

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

    下面是一篇更详细的博客文章: Controlling WSDL minOccurs with WCF

        2
  •  0
  •   Dan    14 年前

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