我在调试我的新 WCF 服务时遇到了令人沮丧的事情。问题出在某个 DataContract 上。似乎在某个属性发生某些事情之后在服务器端进行反序列化,其余的都没有设置。我查看了从元数据生成的生成的 xsd 模式,一切似乎都正常。我使用 Fiddler 来监听发送的 soap 数据包并让客户端所有数据都存在。我什至将 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 之后的所有属性。
为什么?
最佳答案
查看 SOAP 并了解客户端是否为 .NET 会有所帮助。
我曾在使用非 .NET 客户端时看到类似的情况。你的 xsd 指定了一个 sequence
- 使用 Order
属性或默认为字母顺序来确定。一些客户似乎将其视为 all
元素;他们似乎认为“它们都是相同的 XML”(参见 In XML, is order important?)。
总而言之,检查 SOAP 元素的顺序是否与您的 XSD 匹配。
关于c# - 并非所有属性都在 WCF 调用中发送或接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7656560/