【问题标题】:Binding to a SOAP Service With Optional Value Types使用可选值类型绑定到 SOAP 服务
【发布时间】:2026-01-31 19:40:02
【问题描述】:

我有一个使用以下WSDL 生成 SOAP 服务的方法:

<xs:complexType name="updateItem">
  <xs:sequence>
    <xs:element name="itemCode" type="xs:string" />
    <xs:element minOccurs="0" name="itemParentCode" type="xs:string" />
    <xs:element minOccurs="0" name="itemStatus" type="xs:string" />
    <xs:element minOccurs="0" name="isActive" type="xs:boolean" />
    <xs:element minOccurs="0" name="isPrimary" type="xs:boolean" />
  </xs:sequence>
</xs:complexType>

我正在连接到此服务并在 .NET Framework 4.7 桌面应用程序中使用 Visual Studio 生成客户端。

这会生成一个带有以下参数的方法:

public void updateItem(string itemCode, string itemParentCode, 
    string itemStatus, bool isActive, bool isPrimary)

根据服务定义,isActiveisPrimary 是可选参数,但在生成的方法中它们是不可为空的值类型。

有没有办法生成客户端以允许这些是可选的,也许是通过可为空的布尔值?

【问题讨论】:

    标签: .net visual-studio web-services soap wsdl


    【解决方案1】:

    我终于找到了这个问题的答案,但确实感觉默认行为是一个错误。在生成的Reference.svcmap 文档中,您可以添加&lt;Wrapped&gt;true&lt;/Wrapped&gt; 以强制显示*Specified 字段。您必须在ClientOptions 节点下添加Wrapped,如下所示:

    <ClientOptions>
        <Wrapped>true</Wrapped>
    </ClientOptions>
    

    现在重新生成客户端将强制使用消息合约对象,因此调用现在看起来像这样:

    // Update an item
    updateItem(new updateItem 
        { 
            itemCode = "testItem", 
            itemParentCode = "testParent", 
            itemStatus = "testStatus", 
            isActive = true, 
            isPrimary = true, 
            isActiveSpecified = true, 
            isPrimarySpecified = true 
        });
    

    有解决方案让我松了一口气,但仍然认为这应该是生成消息合约以允许这种情况的默认方式。

    【讨论】: