Created
March 28, 2021 02:11
-
-
Save emregulcan/f0f6896b18cf38e5fa0ab007c829e160 to your computer and use it in GitHub Desktop.
Dynamics 365 CE (CRM) ExecuteMultipleRequest code sample
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
try | |
{ | |
/* | |
* INFO : | |
* List<OrganizationRequest> requestList olarak oluşturduğum değişken mevcutta kurguladığımız entegrasyon yapısı için | |
* data kaynağından gelecek olan kayıtları içermektedir. | |
* Örnek kodumuzda sadece Contact create işlemi yapıyoruz, gerçek dünya senaryolarında kayıt güncelleme, silme, ilişkilendirme vb. | |
* işlemleri de aynı şekilde yapabilirsiniz. | |
*/ | |
List<OrganizationRequest> requestList = new List<OrganizationRequest>(); | |
for (int i = 0; i < 3; i++) | |
{ | |
Entity entity = new Entity("contact"); | |
entity["firstname"] = "MultipleRequest"; | |
entity["lastname"] = i.ToString(); | |
CreateRequest createRequest = new CreateRequest() | |
{ | |
Target = entity | |
}; | |
requestList.Add(createRequest); | |
} | |
ExecuteMultipleRequest multipleRequest = new ExecuteMultipleRequest() | |
{ | |
Requests = new OrganizationRequestCollection(), | |
Settings = new ExecuteMultipleSettings() | |
{ | |
ContinueOnError = true, | |
ReturnResponses = true | |
} | |
}; | |
int itemPerPackage = 150; //INFO : Her bir istekte pakette bulunmasını istediğimiz Request sayısı | |
int packageCount = 1; | |
if (requestList.Count > itemPerPackage) | |
{ | |
packageCount = requestList.Count / itemPerPackage; | |
if (packageCount % itemPerPackage != 0) | |
{ | |
packageCount++; | |
} | |
} | |
for (int i = 0; i < packageCount; i++) | |
{ | |
var packageItemList = requestList.Skip(i * itemPerPackage).Take(itemPerPackage).ToList(); | |
//INFO : hazırlanan paketi ExecuteMultipleRequest 'in Requests parametresine ekliyoruz. | |
multipleRequest.Requests.AddRange(packageItemList); | |
/* | |
* INFO : | |
* Bu satırdan sonrasında ExecuteMultipleRequest 'i çalştırıp işlemlerin Dynamics 365 tarafında | |
* işlenmesini sağlamalıyız. | |
* Ayrıca yapmış olduğumuz işleme göre dönüş parametrelerini parse edip, business logic bilgisine göre | |
* gerekli işlemleri kendi uygulamamızda yönetmeliyiz. | |
*/ | |
var multipleResponse = (ExecuteMultipleResponse)connection.Execute(multipleRequest); | |
/* | |
* INFO : | |
* ExecuteMultipleResponse bilgisini işlemek için aşağıdaki alternatif yöntemlerden istediğinizi kullanabilirsiniz. | |
*/ | |
#region | Alternatif 1 | | |
var faultedList = multipleResponse.Responses.Where(d => d.Fault != null).ToList(); | |
var completedList = multipleResponse.Responses.Where(d => d.Fault == null).ToList(); | |
foreach (var item in faultedList) | |
{ | |
/* | |
* INFO : Her bir hatalı request için RequestIndex ve Fault bilgisi dönmektedir. | |
* RequestIndex : İlgili request 'in geçerli paket içinde kaçıncı sırada yer aldığını gösterir. | |
* Fault : İlgii request için oluşan hata bilgisini içermektedir. fault.Message ile direkt olarak hata mesajını alabiliriz. | |
* | |
* Bu sayede her bir request için ayrı ayrı log kaydı vb. oluşturabiliriz. | |
*/ | |
var itemIndex = item.RequestIndex; | |
var fault = item.Fault; | |
} | |
foreach (var item in completedList) | |
{ | |
/* | |
* INFO : Her bir request için RequestIndex ve Response bilgisi dönmektedir. | |
* RequestIndex : İlgili request 'in geçerli paket içinde kaçıncı sırada yer aldığını gösterir. | |
* Response : İlgii request için geçerli olan response bilgisini içermektedir. | |
* Burada OrganizationRequest - OrganizationResponse yapısına göre her bir request - response için CAST işlemi yapmamız gerekmektedir | |
* | |
* Örnek kodlarımızda CreateRequest gönderdik, bu işlemin dönüşü CreateResponse olduğu için bu şekilde CAST yapıyoruz. | |
*/ | |
var itemIndex = item.RequestIndex; | |
var response = (CreateResponse)item.Response; | |
//Id ile oluşturulan kaydın Id bilgisini alabiliriz. | |
var id = response.id; | |
} | |
#endregion | |
#region | Alternatif 2 | | |
foreach (var item in multipleResponse.Responses) | |
{ | |
if (item.Fault == null) | |
{ | |
/* | |
* INFO : Her bir request için RequestIndex ve Response bilgisi dönmektedir. | |
* RequestIndex : İlgili request 'in geçerli paket içinde kaçıncı sırada yer aldığını gösterir. | |
* Response : İlgii request için geçerli olan response bilgisini içermektedir. | |
* Burada OrganizationRequest - OrganizationResponse yapısına göre her bir request - response için CAST işlemi yapmamız gerekmektedir | |
* | |
* Örnek kodlarımızda CreateRequest gönderdik, bu işlemin dönüşü CreateResponse olduğu için bu şekilde CAST yapıyoruz. | |
*/ | |
var itemIndex = item.RequestIndex; | |
var response = (CreateResponse)item.Response; | |
//Id ile oluşturulan kaydın Id bilgisini alabiliriz. | |
var id = response.id; | |
} | |
else | |
{ | |
/* | |
* INFO : Her bir hatalı request için RequestIndex ve Fault bilgisi dönmektedir. | |
* RequestIndex : İlgili request 'in geçerli paket içinde kaçıncı sırada yer aldığını gösterir. | |
* Fault : İlgii request için oluşan hata bilgisini içermektedir. fault.Message ile direkt olarak hata mesajını alabiliriz. | |
* | |
* Bu sayede her bir request için ayrı ayrı log kaydı vb. oluşturabiliriz. | |
*/ | |
var itemIndex = item.RequestIndex; | |
var fault = item.Fault; | |
} | |
} | |
#endregion | |
} | |
} | |
catch (FaultException<OrganizationServiceFault> organizationFaultException) | |
{ | |
/* | |
* INFO : | |
* Dynamics 365 SDK tarafından oluşan hataları FaultException<OrganizationServiceFault> | |
* yapısını kullanarak yakalabiliriz. | |
* | |
* ExecuteMultipleRequest yapısına özel olarak MaxBatchSize hatasını aşağıdaki şekilde yakalayabilir, | |
* ilgil Instance üzerinde MaxBatchSize limitlerini öğrenebiliriz | |
* | |
*/ | |
if (organizationFaultException.Detail.ErrorDetails.Contains("MaxBatchSize")) | |
{ | |
int maxBatchSize = Convert.ToInt32(organizationFaultException.Detail.ErrorDetails["MaxBatchSize"]); | |
} | |
} | |
catch (Exception ex) | |
{ | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment