1

我正在使用 .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; }
}

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

<VehicleUpdate>
    <DealerID>30</DealerID>
    <VIN>1FMRU17L0WLA62356</VIN>
    <Comments>This is a test.</Comments>
    <Retail>1000</Retail>
</VehicleUpdate>

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

System.Runtime.Serialization.SerializationException:第 1 行位置 16 出错。期望来自命名空间“http://schemas.datacontract.org/2004/07/API.Models”的元素“VehicleUpdate”。遇到名称为“元素”的“元素”车辆更新',命名空间''。在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator 阅读器,布尔 verifyObjectName,DataContractResolver dataContractResolver)在 System.Runtime.Serialization. (XmlReader 阅读器)位于 System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c_DisplayClass3

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

4

2 回答 2

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>

XmlSerializer或者在您的 Web API 配置中切换到:

config.Formatters.XmlFormatter.UseXmlSerializer = true;

然后您可以传递您现在传递的确切 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; }
    }
于 2013-01-15T20:50:05.163 回答
1
public static class WebApiConfig
    {
//....
        public static void Register(HttpConfiguration config)
        {  config.Formatters.XmlFormatter.UseXmlSerializer = true;
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.PreserveReferencesHandling =
        Newtonsoft.Json.PreserveReferencesHandling.Objects;
}
于 2014-09-07T05:34:31.757 回答