2017-10-23 11 views
0

ODATA v4バッチ処理 - サーバー上のバッチとしてバッチリクエストを処理するにはどうすればよいですか?ODATA v4バッチ処理 - 要求をサーバー上のバッチとして処理するにはどうすればよいですか?

私は、クライアントが1000のPOST要求を作成して、私のwebapiエンドポイントにバッチとして作成しました。私のエンドポイントはC#とEntity Frameworkを実行しています。

問題は、エンドポイント内のコントローラが各エントリを個別に処理し、バッチ要求内で作成ごとにDBトリップを行うことです。

したがって、1回のPOSTの間、サーバー上で1回はバッチとして処理されません。

バッチリクエストをバッチとして処理する方法はありますか?

+0

AddRange?メソッド –

+0

これを使用しないと、ODATAコントローラは公開された非同期Task Post(MyEntity myEntity) - 1000倍の時間で呼び出されます。私はその動作を無効にする方法が必要です。 – Matt

+0

バッチハンドラにSaveChangesを追加して、バッチ内にあった場合に実行されないようにコントローラのSaveChangesの周りにifを追加しました。これは、たとえ私がそのコードを1000回実行していたとしても、実際にはデータベースに1回しか当たっていなかったことを意味します。 – TomDoesCode

答えて

1

ExecuteRequestMessagesAsyncメソッドでSaveChangesコール・バスト・ハンドラ・クラスを追加し、要求がバッチ要求でない場合はコントローラ内でSaveChangesしか実行しませんでした。つまり、個々のリクエストを個別に実行しても、一度にデータベースに保存するだけです。

コントローラでは、BatchIdプロパティをチェックすることで、これがバッチの一部であるかどうかを確認できます。これを取得するにはSystem.Web.OData.Batch .ODataBatchHttpRequestMessageExtensionsに拡張メソッド(GetODataBatchId)がありますが、これはちょうどHttpRequestMessagePropertiesコレクションからBatchIdというプロパティを取得しています。 (ソースコード:https://github.com/OData/WebApi/blob/master/src/System.Web.OData/OData/Batch/ODataBatchHttpRequestMessageExtensions.cs

「仕様に当てはまる」ことに興味がある場合は、要求全体に対して1回ではなくチェンジセットごとに1回保存する必要があります。

このための良いガイドはこちらです:https://damienbod.com/2014/08/14/web-api-odata-v4-batching-part-10/

関連する問題