4

我正在使用似乎是用 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通常应该生成带有附加bool fieldNameSpecified参数的可选参数 (minOccurs=0),允许调用者指示是否应该序列化该字段(这在此处此处在这里)。

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

[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 消息中)。

在这一点上,我想知道

  1. 为什么 svcutil 不包含fieldNameSpecified参数?
  2. 为什么手动添加参数似乎不起作用?
  3. 是否有任何其他解决方法可用于此问题?

编辑:经过更多研究,我确定部分问题是编写 WSDL 的方式。供应商的 WSDL 不符合 DataContractSerializer 的架构参考。因此,svcutil 将故障回复到 XmlSerializer。

问题是它仍在为方法生成消息契约,而不是数据契约。这似乎会导致默认情况下不可为空的任何类型出现问题,因为它们无法从消息中排除(任何人都可以验证这一点吗?)。无论MessageBodyMemberAttribute出于何种原因,当使用

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

4

1 回答 1

3

After researching the issue, the only solution that I've been able to find is to generate the proxy using the /wrapped option on svcutil. As referenced above in the question, this adds an additional layer of abstraction and allows the message contracts to exist a layer above the parameters. In this case the XmlSerializer does generate the fieldNameSpecified properties and conforms to them.

于 2012-02-03T14:09:15.533 回答