2017-10-23 9 views
0

ODATA v4 일괄 처리 사용 - 서버에서 일괄 처리 요청을 일괄 처리 할 수 ​​있습니까?ODATA v4 배치 작업 - 요청을 서버에서 배치로 어떻게 처리합니까?

클라이언트가 1000의 POST 요청을 성공적으로 만들어 내 webapi 끝점에 대한 일괄 처리로 만듭니다. 내 끝점에서 C# 및 Entity Framework를 실행 중입니다.

문제는 내 끝점의 컨트롤러가 개별적으로 각 항목을 처리하고 배치 요청 내에서 작성 당 DB 트립을 수행한다는 것입니다.

그래서 한 번 POST 중이지만 한 번 서버에있는 동안 배치로 처리되지 않습니다.

배치 요청을 배치로 처리 할 수있는 방법이 있습니까?

+0

입니다. AddRange? 방법 –

+0

그것을 사용하지 않으면, ODATA 컨트롤러는 단지 공개 비동기 작업입니다. Post (MyEntity myEntity) - 1000 배가 호출됩니다. 그 행동을 무시할 방법이 필요합니다. – Matt

+0

배치 핸들러에 SaveChanges를 추가 한 다음 컨트롤러의 SaveChanges 주위에 if를 추가하여 배치에있는 경우 실행되지 않도록했습니다. 이것은 내가이 코드를 1000 번 실행한다고해도 실제로 데이터베이스를 한 번 치는 것만으로도 효과가있을 것이라고 생각하십니까? – 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)

"true to the spec"을 원하면 전체 요청에 대해 한 번만 변경하지 말고 변경 집합마다 한 번 저장해야합니다.

여기에 대한 유용한 안내서는 https://damienbod.com/2014/08/14/web-api-odata-v4-batching-part-10/