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' が必要です..名前 ' の 'Element' が見つかりましたVehicleUpdate'、名前空間 ''. System.Runtime.Serialization.DataContractSerializer.InternalReadObject (XmlReaderDelegator xmlReader、ブール値の verifyObjectName、DataContractResolver dataContractResolver) で System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (XmlReaderDelegator リーダー、ブール値の verifyObjectName、DataContractResolver dataContractResolver) で System.Runtime.Serialization.DataContracter (XmlReader リーダー) System.Net.Http.Formatting.XmlMediaTypeFormatter.<> c_DisplayClass3.

誰かが私が間違っていることを教えてもらえますか? これは有効な XML メッセージだと思いました。

4

2 に答える 2

6

2つのこと:

エラーが示すようにDataContractSerializer、XML が適切な名前空間を提供することを期待していますが、XML にはそれがありません。名前空間を渡すことができます:

<VehicleUpdate xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/API.Models">
 // properties
</VehicleUpdate>

または、Web API 構成で次のように切り替えXmlSerializerます。

config.Formatters.XmlFormatter.UseXmlSerializer = true;

次に、現在渡している正確な XML を渡すことができます。

[Required]null 非許容型で使用すると、別の問題が発生する可能性がありますintint渡されない場合、null ではなく常に 0 になるため、これは既知の問題です。その場合、明示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 に答える