1

明確にするために... WebApiConfig を次のように構成します。

config.Formatters.JsonFormatter.SerializerSettings.Binder = new TypeNameSerializationBinder("namespace.{0}, assembly");
config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Auto;

これにより、派生クラスを基本クラスにバインドできるようになります。また、WebApi がオブジェクトを JSON にシリアル化してクライアントに送信する場合、バインダーは機能しますが、それらをサーバーにポストすると、バインダーは使用されず (BindToType メソッドは呼び出されません)、オブジェクトは基本クラスにバインドされます。

この設定でオブジェクトを手動でシリアライズ/デシリアライズすると、すべて正常に動作します。

何か案は?

4

2 に答える 2

1

カスタム JsonConverters を使用して複雑なオブジェクトを逆シリアル化しようとすると、同じ問題が発生しました。ユーザーの場所を保存するために DbGeometry を使用しているため、これが必要でした。

ジオメトリを Web API に送信するたびに、複合型パラメーターが null に設定されていたため、何か間違ったことをしていると本当に思っていました。これは、JsonConverter が json を塗りつぶされたオブジェクトに完全に変換できた間です。

これに対する私の回避策は以下に書かれています。パラメータを本来のように使用できないのは好きではありません。しかし、ついに機能します。

[HttpPost]
public MyComplexType SaveMyComplexType()
{
    var json = Request.Content.ReadAsStringAsync().Result;
    var myComplexType = JsonConvert.DeserializeObject<MyComplexType>(json);

    //todo: validation and save to db

    return myComplexType;
}
于 2013-02-03T19:21:58.433 に答える
0

調査の結果、これは ASP.NET Web Api のバグであることがわかりました。URL エンコードされたパラメーターが解析されると、新しい JsonSerializer が作成されます (グローバル設定は渡されません)。

ここに提出しました

http://aspnetwebstack.codeplex.com/workitem/609

于 2012-11-07T13:37:26.537 に答える