【问题标题】:REST with Polymorphic DataContracts - Deserialization Fails带有多态 DataContracts 的 REST - 反序列化失败
【发布时间】:2011-10-05 20:42:52
【问题描述】:

这让我一整天都发疯了,因为我没有做任何改变,但我发誓这是按照我昨天的预期工作的。

我有一个使用以下合同定义的 WCF 4 REST 服务:

[ServiceContract]
public interface IPhoneFeaturesManagementHost
{
    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "/accounts/{accountNumber}/phoneNumbers/{phoneNumber}/features/{featureType}", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare)]
    void UpdateFeatureStatus(string accountNumber, string phoneNumber, string featureType, FeatureUpdateRequest updateRequest);
}

我还定义了以下类型:

[DataContract]
[KnownType(typeof(One900FeatureUpdateRequest))]
public abstract class FeatureUpdateRequest
{
    [DataMember]
    public FeatureStatus Status { get; set; }

    [DataMember]
    public DateTime EffectiveDate { get; set; }

    public string AccountNumber { get; set; }
    public string PhoneNumber { get; set; }
    public string UserId { get; set; }
    public DateTime Timestamp { get; set; }

    public override string ToString()
    {
        return String.Format("Status: {0}, Effective Date: {1}", Status, EffectiveDate);
    }
}

[DataContract]
public class One900FeatureUpdateRequest : FeatureUpdateRequest
{
    [DataMember]
    public bool PerformSwitchUpdate { get; set; }
}

昨天我发誓我能够提交这种形式的 POST 数据:

<One900FeatureUpdateRequest>
  <EffectiveDate>1999-05-31T11:20:00</EffectiveDate>
  <Status>Enabled</Status>
  <PerformSwitchUpdate>true</PerformSwitchUpdate>
</One900FeatureUpdateRequest>

今天,同一批 XML 导致 HTTP 400 错误并显示以下消息:

Unable to deserialize XML body with root name 'One900FeatureUpdateRequest' and root namespace '' (for operation 'UpdateFeatureStatus' and contract ('IPhoneFeaturesManagementHost',  'http://tempuri.org/')) using DataContractSerializer. Ensure that the type corresponding to the XML is added to the known types collection of the service.

今天看来唯一可行的 XML 是下面的,我真的很不喜欢添加命名空间加属性来描述我的孩子 DataContract 的子类型的必要性。

<FeatureUpdateRequest i:type="One900FeatureUpdateRequest" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/Project.Services.Host">
  <EffectiveDate>1999-05-31T11:20:00</EffectiveDate>
  <Status>Enabled</Status>
  <PerformSwitchUpdate>true</PerformSwitchUpdate>
</FeatureUpdateRequest>

是否有人对我可能接触过的内容或可能需要更改的内容以恢复到以前的简单 XML 格式进行反序列化有任何想法?

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 试过了,不幸的是没有任何区别。不过谢谢!

标签: c# .net wcf rest datacontract


【解决方案1】:

我找不到使用 DataContractSerializer 执行此操作的方法,因此我改用旧的 XmlSerializer,以便可以直接控制 XML 格式。这似乎奏效了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 2011-12-22
    • 2016-07-25
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多