gpt4 book ai didi

wcf - WCF 客户端的可选枚举

转载 作者:行者123 更新时间:2023-12-04 16:02:17 26 4
gpt4 key购买 nike

我正在使用似乎是用 Java 实现的外部供应商的 Web 服务(我相信 Apache Axis),并且我正在使用 WCF 客户端使用它。一些操作需要枚举类型的输入参数。问题是他们只希望在某些情况下传递枚举。这些元素在 WSDL 中没有标记为可空。但是,由于它们是枚举,即使未指定,我的 WCF 客户端也将始终传递默认值。此行为导致其服务出现内部错误。

关于如何解决这个问题的任何想法?最好是不需要手动修改代理的解决方案,因为如果将来其他开发人员要独立生成代理,这可能会导致混淆。

特定元素在 WSDL 中指定如下

<xs:complexType name="complexTypeName">
<xs:sequence>
<!-- More Stuff Here-->
<xs:element minOccurs="0" name="parameterName" type="tns:parameterName" />
<!-- More Stuff Here-->
</xs:sequence>
</xs:complexType>

<!-- . . . -->

<xs:simpleType name="parameterName">
<xs:restriction base="xs:string">
<xs:enumeration value="ONLY_AVAILABLE_VALUE" />
</xs:restriction>
</xs:simpleType>

Svcutil 将其翻译为

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.0.30319.1")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://vendorwebservicenamespace.com/")]
public enum parameterName
{
/// <remarks/>
ONLY_AVAILABLE_VALUE,
}

编辑:经过更多研究,看起来 svcutil 通常应该生成可选参数 (minOccurs=0) 并附加 bool fieldNameSpecified 参数,允许调用者指示是否应序列化该字段(记录在 hereherehere 中)。

但是,在这种情况下,该参数的引用如下:

[System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://vendorservicenamespace.com/", Order=23)]
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public Namespace.parameterName parameterName;

当我尝试手动添加适当的 fieldNameSpecified 方法时,它似乎对序列化没有任何影响(即,该参数仍然存在于 soap 消息中)。

在这一点上,我想知道
  • 为什么 svcutil 不包括 fieldNameSpecified 参数?
  • 为什么手动添加参数似乎不起作用?
  • 是否有其他解决方法可用于解决此问题?

  • 编辑:经过更多的研究,我确定问题的一部分是编写 WSDL 的方式。供应商的 WSDL 不符合 Schema Reference用于 DataContractSerializer。因此,svcutil 故障返回到 XmlSerializer。

    问题是它仍然为方法生成消息契约,而不是数据契约。对于默认情况下不可为空的任何类型,这似乎会导致问题,因为它们不能从消息中排除(任何人都可以验证这一点?)。无论出于何种原因,当参数被标记为 MessageBodyMemberAttribute 时,XmlSerializer 的 parameterNameSpecified 方法似乎被忽略。 (不知道为什么?)

    我能够绕过这种行为的唯一方法是使用 /wrapped svcutil 选项。这导致消息合约与实际的序列化参数本身分离。在这种情况下,svcutil 生成 parameterNameSpecified 方法,并且 XmlSerializer 符合它们。

    最佳答案

    在研究了这个问题后,我能找到的唯一解决方案是使用 svcutil 上的/wrapped 选项生成代理。正如上面在问题中所提到的,这增加了一个额外的抽象层,并允许消息合约存在于参数之上的一层。在这种情况下,XmlSerializer 会生成 fieldNameSpecified 属性并符合它们。

    关于wcf - WCF 客户端的可选枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098538/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com