.Net Web APIのSerializationException

私は.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を実行してテストしようとしました


    30
    1FMRU17L0WLA62356
    This is a test.
    1000

私がこれを行うと、私は次のSerializationExceptionを取得します:

System.Runtime.Serialization.SerializationException: Error in line 1 position 16. Expecting element 'VehicleUpdate' from namespace 'http://schemas.datacontract.org/2004/07/API.Models'.. Encountered 'Element' with name 'VehicleUpdate', namespace ''. at System.Runtime.Serialization.DataContractSerializer.InternalReadObject(XmlReaderDelegator xmlReader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.DataContractSerializer.ReadObject(XmlReader reader) at System.Net.Http.Formatting.XmlMediaTypeFormatter.<>c_DisplayClass3.b_2()

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

1

2 答え

2つのこと:

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


//properties

または、Web API設定の XmlSerializer に切り替えます。

config.Formatters.XmlFormatter.UseXmlSerializer = true;

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

nullでない型、つまり int [Required] を使用すると、別の問題が発生する可能性があります。これは既知の問題です。なぜなら、渡されなければ int は常に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; }
    }
6
追加された
ありがとう! System.Runtime.Serializationに参照とusingステートメントを追加しました。
追加された 著者 jkruer01,
それから、DataContractとDataMemberの宣言でモデルを更新しました。ありがとう!
追加された 著者 jkruer01,
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;
}
1
追加された