これは非常に奇妙な問題であることがわかりました。xmlリクエストをWebAPIサービスに送信すると、すべてが正常に逆シリアル化されます。ただし、jsonリクエストを送信すると、このONEプロパティは逆シリアル化されません。オブジェクトは次のとおりです。
[Serializable]
[DataContract(Namespace = "")]
public class TransactionData
{
// bunch of other properties that are unaffected ...
private GeotagInfo _geotag;
[DataMember(IsRequired = false, Name = "GeotagInfo", Order = 7)]
public GeotagInfo GeotagInfo
{
get { return _geotag ?? new GeotagInfo(); }
set { _geotag = value; }
}
}
[DataContract(Namespace = "")]
public class GeotagInfo
{
[DataMember(IsRequired = false, Name = "Longitude", Order = 1, EmitDefaultValue = false)]
public string Longitude { get; set; }
[DataMember(IsRequired = false, Name = "Latitude", Order = 2, EmitDefaultValue = false)]
public string Latitude { get; set; }
[Image(Nullable = true)]
[DataMember(IsRequired = false, Name = "MapImage", Order = 3, EmitDefaultValue = false)]
public string MapImage { get; set; }
[XmlIgnore]
public int TransactionId { get; set; }
}
xmlリクエストを使用してコントローラーのエントリポイントでブレークした場合。geotagプロパティがあり、完全に入力されています。jsonリクエストで同じことを行うと、geotagプロパティがインスタンス化されますが、その値はすべてnullです。この親オブジェクトの他のすべては問題ありません。
これは、jsonリクエストのプロパティです。
"GeotagInfo": {
"Longitude": "-yy.yyyy",
"Latitude": "xx.xxxx",
"MapImage": "base64 string"
}
プロパティゲッターに注意してくださいget { return _geotag ?? new GeotagInfo(); }
xmlリクエストにはこれに関する問題はありません。しかし、それを削除して作成するとget { return _geotag; }
、問題は解決します。残念ながら、これはサービスのより深いところに他の問題を引き起こします。
何が起きてる?xmlではうまく機能しますがjsonでは機能しません(デフォルトのゲッターを削除しない限り)。MVC4がjson.netを使用していることを知っているので、それはそれと関係があるかもしれません。
注:他のスレッドで提案されているように、クラスからシリアル化可能な属性を削除しようとしました。変化なし。