C# WCF REST服务能否支持具有任意元素顺序的XML消息的反序列化?

C# WCF REST服务能否支持具有任意元素顺序的XML消息的反序列化?,c#,wcf,rest,C#,Wcf,Rest,我有一个C#WCF REST服务,它允许添加一个书签,方法是发送一个HTTP POST请求,将书签序列化为XML。我已经为服务指定了操作契约,它将获取xml并自动为我反序列化对象。我的问题是,只有当请求中的XML元素按字母顺序给出,并且没有填充任何无序元素的值时,反序列化才能正常工作 我觉得这很不令人满意;我认为以特定的顺序构造XML是不必要的,也是一个主要的问题。这是添加到服务的所有客户端的主要要求,也是调试潜在困难问题的根源 是否可以将WCF指示为XML元素顺序不可知? 为澄清起见,请提

我有一个C#WCF REST服务,它允许添加一个书签,方法是发送一个HTTP POST请求,将书签序列化为XML。我已经为服务指定了操作契约,它将获取xml并自动为我反序列化对象。我的问题是,只有当请求中的XML元素按字母顺序给出,并且没有填充任何无序元素的值时,反序列化才能正常工作

我觉得这很不令人满意;我认为以特定的顺序构造XML是不必要的,也是一个主要的问题。这是添加到服务的所有客户端的主要要求,也是调试潜在困难问题的根源

是否可以将WCF指示为XML元素顺序不可知?


为澄清起见,请提供更多详细信息:

我的运营合同如下所示:

[OperationContract]
[WebInvoke(Method="POST", UriTemplate = "/{username}/bookmarks", ResponseFormat = WebMessageFormat.Xml)]
public void PostBookmark(string username, RestBookmark newBookmark);
REST消息如下所示:

[DataContract(Name = "Bookmark", Namespace = "")]
public class RestBookmark
{   
    [DataMember]
    public string BookmarkMd5 { get; set; }

    [DataMember]
    public string Url { get; set; }

    [DataMember]
    public string UserName { get; set; }

    [DataMember]
    public string Title { get; set; }

    [DataMember]
    public string Description { get; set; }
}
如果发送以下XML消息,则在调用PostBookmark()时,仅填充RestMessage对象的UserName属性:

<?xml version="1.0"?><Bookmark><UserName>nick.street</UserName><Url>http://www.stackoverflow.com</Url><BookmarkMd5>f184eb3347cf94f6ce5f5fc2844e3bdd</BookmarkMd5><Description>Developer Forum</Description><Title>Stack Overflow</Title></Bookmark>
尼克·streethttp://www.stackoverflow.comf184eb3347cf94f6ce5f5fc2844e3bddDeveloper ForumStack溢出
尝试将DataMember属性中的顺序设置为0(对于所有成员):


[DataMember(Name=“Title”,Order=0)]

我自己没有尝试过这样做,但我会猜一猜

在DataContract上创建一个在反序列化之前触发的[OnDeserialization]事件会有帮助吗?在这一点上,也许您可以对xml进行重新排序,但是需要对其进行排序,以便反序列化能够正常工作

如果您有Juval Lowy的编程WCF服务第二版,请参阅第107页


.

出于版本控制和性能原因,DataContractSerializer需要对元素进行严格排序

我可以想出一些选择

  • 编写一个消息检查器,在dataContractSerializer对原始XML元素进行反序列化之前,对AfterReceivedRequest中的原始XML元素重新排序

  • 为您的服务使用XmlSerializer

  • 开发HTTP原始XML消息流程 而是服务

  • 将对象作为字典传递(不是 (推荐)


  • 如果您不打算在
    DataMember
    属性中指定
    Order
    以反映节点的顺序,则必须在xml中按字母顺序排列节点。

    谢谢您的建议。不幸的是,这并没有起到任何作用——当多个项具有相同的顺序时,它们似乎会恢复为字母顺序,而不是“无序”。好吧,我看得越多,我不确定您是否可以在这一点上获得传递的XML,但也许您可以以某种方式使用钩子……我喜欢使用XMLSerializer的想法。