2

私は現在、コード ファースト アプローチで Web Api 2 と EF6 を使用して OData サービスを開発しています。私のコントローラーは、通常のApiController Base から継承しています。

アクション メソッドを Queryable 属性で装飾し、WebApiConfig ファイルでクエリ サポートを有効にしました。CORS ポリシーを通じて、DataServiceVersion と MaxDataServiceVersion を Accept ヘッダーと Exposed ヘッダーの一部として指定しました。

奇妙なことに、私の odata エンドポイントは応答ヘッダーの一部としてDataServiceVersionを返さないようですが、コントローラーが ODataController ベースから継承されている場合、応答でそれを確認できます。

ApiController を base として使用しているときに、このヘッダーを有効にする方法はありますか

このヘッダーは、datajs がクライアント側で必要とするため必要です。

4

1 に答える 1

2

最初に質問に答えます。はい、DataServiceVersion http ヘッダーを自分で公開できます。ただし、これはカスタム コードであり、既存のコンポーネントの設定ではありません。

グローバル http 構成に「フィルター」を追加します。フィルターは、"System.Web.Http.Filters.ActionFilterAttribute" から派生したクラスです。

例えば;

internal class DataServiceVersionHeaderFilterWebAPI : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        actionExecutedContext.Response.Content.Headers.Add("DataServiceVersion", "3.0");
        actionExecutedContext.Response.Content.Headers.Add("Access-Control-Expose-Headers", "DataServiceVersion");
    }
}

次に、このフィルターを使用するように構成します (global.asax のアプリケーション開始時)。

GlobalConfiguration.Configuration.Filters.Add( new DataServiceVersionHeaderFilterWebAPI() );

これにより、セキュリティの観点からクロス ドメイン OData クエリが可能になります。ただし、これには別の問題があります。

OData は、要求 URI と HTTP ヘッダーだけよりも大きな仕様です。また、モデル情報を交換する方法も指定します。実際のデータ交換は事前定義されたオブジェクト構造です。シンプルですが、定義済みの構造です。

object.d = サービスが返すコンテンツ

仕様のすべての部分 ($filter、$metadata、$top、戻り値の形式など) を自分で実装する必要があります。

考えるためのいくつかの食べ物。

于 2014-07-25T10:07:43.167 に答える