4

次のように、新しいWebAPIODataパッケージからODataResultを返します。

public ODataResult<Product> Get(ODataQueryOptions options)
{
  var results = (options.ApplyTo(_db.Products) as IQueryable<Product>);
  var count  = results.Count;
  var limitedResults = results.Take(100).ToArray();
  return new ODataResult<Product>(results,null,count);
}

上記はうまく機能しますが、クエリの種類に関係なく、常にAtom応答を返します。JSONを返すにはどうすればよいですか?

AtomがODataMediaTypeFormatterコレクション内で最初にサポートされているメディアタイプであることがわかります。Atomのサポートは必要ないので、完全に削除するだけでよかったと思います。さらに良いのは、コンテンツタイプを正しくネゴシエートすることです。

4

2 に答える 2

4

次のように、accept ヘッダーを設定してみましたか。

Accept=application/json;odata=verbose.

JSON が返されるはずです。OData プロトコルはしばらくの間 JSON をサポートしていましたが、プロトコルの V3 では application/json が JSON light と呼ばれるものにマップされています (まだ実装されていません)。したがって、JSON ライトがサポートされて JSON を取得できるようになるまでは、もう少し具体的にして、V1 以降の OData にあるより詳細なバージョンの JSON を要求する必要があります。

于 2012-08-18T07:48:52.940 に答える
2

私は現在、あなたがリンクした Beta Package を使用して OData サポートも試しています。これはベータ パッケージであり、リリースまでに変更される可能性があることに注意してください。私は同じ問題にぶつかりました。現在、Microsoft は Web Api で OData v3 のサポートを提供することを計画しているようです。ODataMediaTypeFormatter を見ると、これが明らかになります。

OData v3 には、次の 3 つの形式があります。

  • アトム ( application/atom+xml)
  • JSON 詳細 ( application/json;odata=verbose)
  • JSON ライト ( application/json;odata=light)

Atom は唯一の OData の既定の XML 形式です。OData v3 のデフォルトの JSON 形式は JSON ライトです。古い OData v2 JSON 形式は、OData v3 で JSON Verbose になったものです。

これは、仕様(v20120705) セクション 2.2.5.1 でサポートされており、Accept および対応する応答ヘッダーがリストされています。

application/json;odata=verbose ->  application/json;odata=verbose

アプリケーション/json;odata=光  -> アプリケーション/json;odata=光

application/json -> バージョン 1.0 およびバージョン 2.0 の応答の場合: application/json;odata=verbose. バージョン 3.0 応答の場合: application/json;odata=light

残念ながら、彼らはまだ JSON light を指定していません (セクション 2.2.5.1.3、私の強調):

JSON ライト形式は、OData 3.0 プロトコルでのみ定義された新しい形式であり、表現にメタデータ情報を含めないことで小さいサイズに最適化します。詳細形式は、OData 1.0、2.0、および 3.0 プロトコルで定義された既存の JSON ベースの形式を表し、インスタンスの表現と共にメタデータ情報を含みます。JSON light content-type の形式は、このバージョンのドキュメントでは定義されていません

ただし、JSON Light 形式が JSON Verbose 形式の適切なサブセットになることを期待しています。ODataMediaTypeFormatter の現在の実装はapplication/json;odata=verboseapplication/atom+xmlヘッダーにのみ応答するか、ATOM にフォールバックします。興味深いことに、指定すると406$format=jsonが返されるようです。

軽量フォーマットが詳細フォーマットの適切なサブセットであると仮定する暫定的な解決策が必要な場合は、MediaTypeFormatter にapplication/json要求に応答するように指示できます。これにより、accept ヘッダーの指定を省略できるため、jQuery から OData を操作するのがはるかに簡単になります。 :

ODataMediaTypeFormatter odataFormatter = new ODataMediaTypeFormatter(model);    
odataFormatter.SupportedMediaTypes.Add(MediaTypeHeaderValue.Parse("application/json"));
于 2012-09-11T13:46:04.257 に答える