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消息.
两件事情:
如错误所述,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)
| 归档时间: |
|
| 查看次数: |
5999 次 |
| 最近记录: |