使用多态数据契约的REST - 反序列化失败

5
这让我整天感到很烦,因为我没有进行任何更改,但我发誓昨天这个服务是按照我预期的方式工作的。 我定义了一个具有以下协定的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格式进行反序列化?

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


尝试了这个,但不幸的是没有任何改变。谢谢! - Paul Kirby
1个回答

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,