2011-10-05 26 views
5

Điều này đã khiến tôi phát điên cả ngày, vì tôi đã không thực hiện thay đổi nào nhưng tôi thề là đã làm việc theo cách tôi đã dự định hôm qua.REST with Polymorphic DataContracts - Deserialization Fails

Tôi có một WCF 4 dịch vụ REST được xác định theo hợp đồng sau đây:

[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); 
} 

Tôi cũng đã các loại sau đây định nghĩa:

[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; } 
} 

Hôm qua tôi thề tôi đã có thể gửi dữ liệu POST của biểu mẫu này:

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

Hôm nay, cùng một lô XML đó gây ra lỗi HTTP 400 với thông báo sau:

XML duy nhất dường như hoạt động hôm nay là bên dưới và tôi thực sự không thích việc thêm không gian tên cộng với thuộc tính mô tả loại con của DataContract con tôi.

<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> 

Có ai có bất kỳ ý tưởng nào về những gì tôi có thể đã chạm hoặc những gì tôi có thể cần thay đổi để quay lại định dạng XML đơn giản trước đây để deserialization không?

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn!

+0

Hãy thử xóa khóa trừu tượng –

+0

Đã thử điều này và rất tiếc là không có sự khác biệt. Cảm ơn mặc dù! –

Trả lời

1

Tôi không thể tìm thấy cách để làm điều này với DataContractSerializer, vì vậy tôi thay vì chuyển sang XmlSerializer cũ để tôi có thể kiểm soát trực tiếp định dạng XML. Điều này dường như làm việc.