2011-10-05 12 views
5

Esto me ha estado volviendo loco todo el día, ya que no he hecho ningún cambio, pero juro que esto funcionaba de la manera que había pensado ayer.RESTO con DataContracts polimórficos - La deserialización falla

Tengo un servicio REST WCF 4 definida con el siguiente contrato:

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

También he los siguientes tipos definidos:

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

Ayer te juro que era capaz de enviar datos POST de esta forma:

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

Hoy ese mismo lote de XML está causando errores HTTP 400 con el siguiente mensaje:

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. 

La única XML que parece funcionar hoy en día es el siguiente, y realmente no le gustan la necesidad de añadir un espacio de nombres más atributos para describir el subtipo de mi hijo 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> 

¿Alguien tiene alguna idea de lo que podría haber tocado o lo que podría tener que cambiar para volver al formato XML sencilla antes de deserialización?

Cualquier ayuda sería muy apreciada. ¡Gracias!

+0

Intente quitar la clave abstracta –

+0

Intenté esto y desafortunadamente no hizo la diferencia. ¡Gracias! –

Respuesta

1

No pude encontrar una manera de hacer esto con el DataContractSerializer, así que en su lugar cambié al viejo XmlSerializer para poder tener control directo sobre el formato XML. Esto pareció funcionar.

Cuestiones relacionadas