2

クエリの結果を取得するために ODataController を使用しています。コントローラーは次のように定義されます。

public class RunController : ODataController
{
    [EnableQuery(MaxNodeCount = 1000)]
    public IHttpActionResult Get() {
        ...
    }
}

コントローラーに直接行くと動作します。私のルートは、次の URL に移動するように設定されています。

http://localhost:58704/odata/Run

ルート構成は次のようになります。

config.MapODataServiceRoute(
   routeName: "defaultOdata",
   routePrefix: "odata",
   model: GetModel(),
   batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));

GetModel() は次のようになります。

public static Microsoft.OData.Edm.IEdmModel GetModel()
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<RunController.RunModel>("Run");
    return builder.GetEdmModel();
}

ご覧のとおり、defaultOdataBatchHandler を有効にしました。の

http://localhost:58704/odata/$batch

問題なく動作します。次のステップは、バッチ ステートメントを作成することです。これは、datajs によって行われ、次のようになります。

return OData.request({
    requestUri: "http://localhost:58704/odata/$batch",
    method: "POST",
    data: {
        __batchRequests: [
             {requestUri: "Run", method: "GET" }
        ]
    }
}, function (data, response) {
    console.log(data.__batchResponses);
}, undefined, OData.batchHandler);

バッチ クエリは必要なものを取得し、HTTP 200 を返します。これはすばらしいことです。に変換される内部のクエリhttp://localhost:58704/odata/Runは、HTTP 404 を返します。そして、私の人生では理由を理解できません。

という行は、次console.log(data.__batchResponses)のようなメッセージ プロパティを持つ 1 つのオブジェクトを返します。「HTTP 要求が失敗しました」、および応答の本文には次のように記載されています。

"{"message":"No HTTP resource was found that matches the request URI 'http://localhost:58704/odata/Run'.","messageDetail":"No type was found that matches the controller named 'odata'."}"

エラーメッセージに表示されているURLを使用すると、問題なく動作します。method: "GET"バッチ リクエストの が正しく機能していない可能性がありますか?

4

1 に答える 1

2

ASP.NET Web API OData アプリケーションで使用したクラスとメソッドに基づいて、OData V4 を使用していると思います。しかし、クライアント (dataJS) は OData V4 をサポートしていません。次のコードで OData V4 をサポートする apache odatajs を使用できます。

window.odatajs.oData.request({
            requestUri: "/odata/$batch",
            method: "POST",
            data: {
                __batchRequests: [
                     { requestUri: "Products", method: "GET" }
                ]
            }
        }, function (data, response) {
            console.log(data.__batchResponses[0].data.value);
        }, undefined, window.odatajs.oData.batch.batchHandler);

どちらのライブラリも API は同じなので問題ありません。

サーバー側 (ASP.NET Web API OData V4) とクライアント側 (apache odatajs) の両方を含む完全なサンプルは、ここからダウンロードできます。

https://github.com/ymoradi/samples/tree/master/NetFX/ASP.NET/ASP.NET%20Web%20API/OData/apache%20odatajs%20v4%20sample%20code

2 つのリクエストの違いは次のとおりです。

odatajs request headers(successful one):
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json;q=0.9, */*;q=0.1

datajs request headers(failed one):
MaxDataServiceVersion: 3.0
DataServiceVersion: 1.0
Accept: application/atomsvc+xml;q=0.8, application/json;odata=fullmetadata;q=0.7, application/json;q=0.5, */*;q=0.1
于 2014-11-15T06:25:44.253 に答える