Skip to content

Instantly share code, notes, and snippets.

@emregulcan
Created March 28, 2021 02:11
Show Gist options
  • Save emregulcan/f0f6896b18cf38e5fa0ab007c829e160 to your computer and use it in GitHub Desktop.
Save emregulcan/f0f6896b18cf38e5fa0ab007c829e160 to your computer and use it in GitHub Desktop.
Dynamics 365 CE (CRM) ExecuteMultipleRequest code sample
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