【问题标题】:Not all properties are being sent or received in a WCF call并非所有属性都在 WCF 调用中发送或接收
【发布时间】:2011-10-05 03:58:18
【问题描述】:

我在调试我的新 WCF 服务时遇到了令人沮丧的事情。问题在于某个 DataContract。似乎在某个属性发生后在服务器端进行反序列化,其余部分未设置。我查看了从元数据生成的 xsd 模式,一切似乎都很好。我使用 Fiddler 来监听发送的肥皂数据包,并让客户端所有数据都存在。我什至将 Order 参数设置为 DataContract 属性,以查看我是否可以看到模式但从未看到。我还将 DataMember 名称与消息中的名称进行了比较,它们都匹配。我发现的唯一模式是:

以下是相关 DataContract 对象的 xsd 定义:

<xs:complexType name="Attachment">
 <xs:sequence>
  <xs:element minOccurs="0" name="dateTime" type="xs:dateTime"/>
  <xs:element minOccurs="0" name="description" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="fileName" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="guid" type="ser:guid"/>
  <xs:element minOccurs="0" name="obsDate" type="xs:dateTime"/>
  <xs:element minOccurs="0" name="operation" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="originalFileName" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="title" nillable="true" type="xs:string"/>
  <xs:element minOccurs="0" name="type" nillable="true" type="xs:string"/>
 </xs:sequence>
</xs:complexType>

这是 DataContract 对象:

[DataContract(Namespace="http://www.myns.com")]
public class Attachment
{
    public enum AttachmentSortOrder { Date, FileType }

    [DataMember]
    public Guid guid;
    [DataMember]
    public DateTime dateTime;
    [DataMember]
    public string operation;
    [DataMember]
    public DateTime obsDate;
    [DataMember]
    public string originalFileName;
    [DataMember]
    public string fileName;
    [DataMember]
    public string title;
    [DataMember]
    public string type;
    [DataMember]
    public string description;
}

似乎 obsDate 之后的所有属性由于某种原因没有设置。

为什么?

【问题讨论】:

  • 您能否发布您用于反序列化的 XML(这会导致无法设置属性)?

标签: c# .net wcf


【解决方案1】:

查看 SOAP 并了解客户端是否为 .NET 会有所帮助。

我已经看到使用非 .NET 客户端发生类似情况。您的 xsd 指定了一个 sequence - 这由使用 Order 属性或默认为字母顺序确定。一些客户似乎将此视为all 元素;他们似乎认为“都是相同的 XML”(参见 In XML, is order important?)。

因此,总而言之,检查 SOAP 元素的顺序是否与您的 XSD 匹配。

【讨论】:

  • 是的,客户端是 .NET 但 2.0。我基本上已经使用 WCF 重写了旧的 asp.net Web 服务 (.asmx)。我无法更改消费者/主机。我已经玩过订单并尝试匹配传入的消息,但它没有用。不过我会再试一次。稍后我还会发布传入的 SOAP 消息。
  • 匹配 DataContract 对象 DataMember 顺序与传入消息相同,已修复它。不太清楚我昨晚玩这个时做错了什么。
【解决方案2】:

启用 WCF 错误日志记录并通过 SvcTraceViewer.exe 找出根本原因

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多