1

WCFRestfulサービスを呼び出していたMVCWebサイトがありますが、現在はWebApi呼び出しに置き換えています。問題は、一部のMVCコントローラーの既存のコードが、JSONのオブジェクトごとに返される「__type」属性に依存しているため、オブジェクトのタイプに応じて異なる処理を実行できることです。

ただし、新しいWeb Api応答では、返される各オブジェクトのJSONに「__ type」エントリがないため、コードは失敗します。

誰かがこれがどのように行われるか知っていますか?WCFサービスの__typeエントリを削除することについてはたくさん見つけましたが、それらがWebApiに含まれていることを確認するための方法はまだありません。

4

2 に答える 2

4

この__typeフィールドはDataContractJaonSerializer(DCJS)の機能であり、特にASP用にあります。適用された動作で構成されたエンドポイントのNETAJAX互換性enableWebScript。さらに具体的には、この機能はDataContractSerilizerSettings::EmitTypeInformationプロパティをAsNeededまたはに設定することで制御されますAlways

箱から出して、WebAPIはJSONメディアのフォーマッターとしてJSON.NETを使用するようにバインドされており、そのTypeNameHandling機能で同様の概念をサポートしていますが、DCJSとのワイヤー互換性はありません。

これで、次のようにWebAPIを切り替えてDCJSを非常に簡単に使用できるようになります。

GlobalConfiguration.Configuration.Formatters.JsonFormatter.UseDataContractJsonSerializer = true;

ただし、これらの場合に内部で作成されるDCJSインスタンスは構成されていないため、それでも役に立ちません。EmitTypeInformatiomつまり、デフォルトで。になりますNone

したがって、必要なものを取得する唯一の解決策はMediaTypeFormatter、DCJSインスタンスを作成/構成する独自のサブクラスを作成しEmitTypeInformation、それを登録して、組み込みのJsonMediaTypeFormatterではなくJSONメディアタイプを処理することです。幸いなことにASP以来。NET Web APIはオープンソースであるため、既存の実装をコピーして、この特定のケースに合わせて非常に簡単に調整できるはずです。

于 2012-11-06T16:26:16.200 に答える
1

私はもっ​​とグーグルした後に答えを見つけました。

WebApiコントローラープロジェクト側で、グローバルApp_Start関数に次を追加しました。

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = TypeNameHandling.Objects;

そして、逆シリアル化しようとしているときにクライアントC#側で、次のように追加しました。

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.TypeNameHandling = TypeNameHandling.Objects;

つまり、基本的には、シリアライザーのTypeNameHandling.Objects設定で、__typeの代わりに各オブジェクトの$typeを出力しますが、それでもすべて機能します。

于 2012-11-06T16:24:52.403 に答える