.Net Web API SerializationException

jkr*_*r01 1 .net asp.net xml-serialization wcf-web-api asp.net-web-api

我正在使用.Net的Web API编写一个简单的API.我定义了以下模型:

public class VehicleUpdate
{
    [Required(ErrorMessage = "DealerID Required")]
    public int DealerID { get; set; }

    [Required(ErrorMessage = "VIN Required")]
    [StringLength(17, ErrorMessage = "VIN Must be 17 characters", MinimumLength = 17)]
    public string VIN { get; set; }

    [StringLength(8000, ErrorMessage = "Comments must be less than 8,000 characters")]
    public string Comments { get; set; }

    public double Retail { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过使用以下XML执行HTTP Post来测试它

<VehicleUpdate>
    <DealerID>30</DealerID>
    <VIN>1FMRU17L0WLA62356</VIN>
    <Comments>This is a test.</Comments>
    <Retail>1000</Retail>
</VehicleUpdate>
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到以下SerializationException:

System.Runtime.Serialization.SerializationException:第1行位置的错误16.期望来自名称空间'http://schemas.datacontract.org/2004/07/API.Models'的元素'VehicleUpdate'..遇到名为'的'元素' VehicleUpdate',命名空间''.在System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator的XmlReader,布尔verifyObjectName,DataContractResolver dataContractResolver)在System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator读卡器,布尔verifyObjectName,DataContractResolver dataContractResolver)在System.Runtime.Serialization.DataContractSerializer.ReadObject (XmlReader reader)位于System.Net.Http.Formatting.XmlMediaTypeFormatter.<> c_ DisplayClass3.b _2()

有人可以告诉我我做错了什么吗?我认为这将是一个有效的XML消息.

Fil*_*p W 6

两件事情:

如错误所述,DataContractSerializer期望XML提供适当的命名空间,而您的XML没有它.您可以传递命名空间:

<VehicleUpdate xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/API.Models">
 // properties
</VehicleUpdate>
Run Code Online (Sandbox Code Playgroud)

或者切换到XmlSerializerWeb API配置:

config.Formatters.XmlFormatter.UseXmlSerializer = true;
Run Code Online (Sandbox Code Playgroud)

然后,您可以传递您现在传递的确切XML.

当你使用[Required]非可空类型时,你可能会遇到另一个问题int.这是一个已知问题,因为int如果没有传递,它将始终为0而不是null.在这种情况下,您可能必须更改模型以具有明确的DataContract定义:

  [DataContract]
    public class VehicleUpdate
    {
        [DataMember(IsRequired = true)]
        [Required(ErrorMessage = "DealerID Required")]
        public int DealerID { get; set; }

        [DataMember]
        [Required(ErrorMessage = "VIN Required")]
        [StringLength(17, ErrorMessage = "VIN Must be 17 characters", MinimumLength = 17)]
        public string VIN { get; set; }

        [DataMember]
        [StringLength(8000, ErrorMessage = "Comments must be less than 8,000 characters")]
        public string Comments { get; set; }

        [DataMember]
        public double Retail { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)