Visual Studio (C#) projelerinde Dynamics 365 CE ‘e Erişim

Bu yazı 02 Mart 2019 tarihinde Medium/@dynamics365 altında yayınlanmıştır. 26 Nisan 2020 tarihinde emregulcan.com altında taşınmıştır.

İçerikler, yazının oluşturulduğu tarih için geçerli olup, Microsoft Dynamics 365 CE, Power Platform ve Azure hizmetlerinin sürekli iyileştirme ve güncelleme döngüsünden dolayı paylaşılan bilgilerde değişiklikler meydana gelmiş olabilir.

Merhaba,

Bu yazımızda C# ile geliştirdiğimiz projelerimizde Dynamics 365 CE (CRM) web servislerine nasıl bağlanacağımızı tüm detaylarıyla adım adım inceleyeceğiz.

Eğer Dynamics 365 CE (CRM) SDK hakkında yada nasıl indirileceği konusunda bilgi sahibi değilseniz önceki yazımı okumanızı tavsiye ederim.

Bu örnekte ilk olarak Console Application üzerinde geliştirme yapacağız, sonrasında ise ilerleyen konularımızda kolaylık sağlaması için bu bağlantı işlemlerini bir library üzerine taşıyacağız.

İlk olarak Dynamics 365 CE SDK bileşenlerini projemize eklememiz gerekli.

Bunun için projemize sağ tıklayıp Manage NuGet Packages menüsünü kullanabiliriz.

Manage NuGet Packages menüsü
Manage NuGet Packages menüsü

Açılan ekranda Browse sekmesinde arama bölümüne Microsoft.CrmSdk.CoreAssemblies ya da kısaca CrmSdk yazarak ilgili bileşenlere ulaşabiliriz.

Bu yazıyı hazırladığım tarihte en güncel sürüm 9.0.2.12 olarak yayınlanmış durumda. Eğer Dynamics 365 CE Online kullanıyorsanız son sürümü kullanmanızı öneririm, on-prem ortamlarda ise ilgili sürüme göre SDK kullanmanız gerekmekte.

NuGet — Microsoft.CrmSdk.CoreAssemblies
NuGet — Microsoft.CrmSdk.CoreAssemblies

Alternatif olarak Package Manager Console üzerinden Install-Package Microsoft.CrmSdk.CoreAssemblies komutunu kullanarak ilgili projeye gerekli bileşenleri ekleyebilirisiniz.

Package Manager Console
Package Manager Console

9.0.2.9 ve sonrası sürümlerde yükleme aşamasında Attempting to gather dependency information for packege ‘Microsoft.CrmSdk.CoreAssemblies.9.0.2.12’ with respect to project ‘PROJECT_NAME’, targetting ‘.NETFramework, Version=v4.5.2’ gibi bir hata alırsanız, çalıştığınız projenin .NET Framework sürüm bilgisini yükseltmeniz gerekecektir.

https://www.nuget.org/packages/Microsoft.CrmSdk.CoreAssemblies adresinde görebileceğiniz üzere projelerimizde CRM SDK 9.0.2.9 ve sonrasını kullanmak istiyorsak projemizin .NET Framework sürüm bilgisi minimum 4.6.2 olmalıdır.

Microsoft.CrmSdk.CoreAssemblies 9.0.2.9 ve sonrası için minimum .NET Framework 4.6.2 gereklidir.
Microsoft.CrmSdk.CoreAssemblies 9.0.2.9 ve sonrası için minimum .NET Framework 4.6.2 gereklidir.
Microsoft.CrmSdk.CoreAssemblies 9.0.2.9 ve sonrası için minimum .NET Framework 4.6.2 gereklidir.
Microsoft.CrmSdk.CoreAssemblies 9.0.2.9 ve sonrası için minimum .NET Framework 4.6.2 gereklidir.

Eğer projenizin .NET Framework sürümünü çeşitli nedenlerden dolayı yükseltemiyorsanız ve .NET Framework 4.5.2 ve altında ise, Dynamics 365 SDK için 9.0.2.5 ve altındaki sürümleri kullanabilirsiniz.

Bu durumda OrganizationService bağlantısı aşamasında Metadata contains a reference that cannot be resolved : ‘https://organizationname.crm4.dynamics.com/?wsdl=sdkversion=9’ şeklinde genel bir hata alırsınız. Hatanın detaylarına (InnerException) baktığımızda ise Unable to read data from the transport connection : An existing connection was forcibly close by the remote host , The underlying connection was closed : An unexpected error occured on a send. mesajlarını bulabilirsiniz.

Bu hatanın nedeni Microsoft ‘un Dynamics 365 CE (CRM) için TLS 1.2 güncellemesi yapması ve bunu zorunlu hale getirmesidir. Hatayı önlemek için IOrganizationService oluşturmadan önce aşağıdaki kodu eklemeniz gerekmektedir.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

SecurityProtocolType.Tls12 ayarı
SecurityProtocolType.Tls12 ayarı

Yükleme işlemi tamamlandığında projemizin References altında Microsoft.Crm.Sdk.Proxy ve Microsoft.Xrm.Sdk dll ‘leri yer alacaktır.

References
References

Dynamics 365 CE (CRM) ‘e bağlanabilmek için OrganizationService url bilgisine ihtiyacımız bulunmakta. Bu adresi alabilmek için aşağıdaki adımları takip edebilirsiniz.

Dynamics 365 ana menüsü üzerinden Settings (Ayarlar)> Customizations (Özelleştirmeler)> Developer Resources (Geliştirici Kaynakları) bağlantılarını kullanarak ilgili sayfaya erişmeliyiz.

Dynamics 365 Menüsü
Dynamics 365 Menüsü

Developer Resources sayfasında Dynamics 365 CE (CRM) için bir çok teknik detay yer almaktadır.

Bu yazımızın konusu OrganizationService ‘e bağlanmak olduğu için bizim için önemli kısım OrganizationService bölümünde bulunan url bilgisi.

Bu url standart olarak https://ORGANIZASYONADI.api.crm4.dynamics.com/XRMServices/2011/Organization.svc formatındadır. ORGANIZASYONADI olarak belirttiğim bilgi, Dynamics 365 CE Online Deneme Ortamı Oluşturmak başlıklı yazımda bahsettiğim kayıt aşamasında belirlediğimiz isimdir. crm4 ise, yine aynı yazıda bahsettiğim Dynamics 365 CE ‘nin bulunduğu region (bölge) ile ilgilidir, Türkiye ‘den alınan Dynamics 365 CE instance ‘lar crm4 region ‘da yer almaktadır.

Dynamics 365 CE — Developer Resources
Dynamics 365 CE — Developer Resources

Bu arada unutmamamız gereken önemli bir nokta, geçtiğimiz yıllarda Dynamics 2016 Service Pack 1 ile birlikte (sürüm 8.1) Microsoft OrganizationService ‘i (2011 endpoint yada SOAP endpoint olarakta anılmakta) sonlandırma kararı aldı (deprecated), fakat henüz tam anlamıyla sonlandırılmış değil. Bundan sonra OrganizationService yerine WebAPI kullanarak bağlantı kurmamız gerekiyor.

Dynamics 365 CE SDK tarafında bu geçiş Microsoft tarafından otomatik olarak yapılacak ve kodlar WebAPI destekli olarak çalışacak.

https://docs.microsoft.com/en-us/previous-versions/dynamicscrm-2016/developers-guide/dn281891(v=crm.8) adresinden detaylara ulaşabilirsiniz.

Artık Dynamics 365 CE (CRM) OrganizationService ‘e bağlanmak için herşey tamam, şimdi kod yazma zamanı 🙂

Dynamics 365 CE (CRM) OrganizationService ‘e bağlanmak için birden fazla alternatif yöntem mevcut, bunların en basiti, işlem yapacağımız kullanıcının kullanıcı adı ve parola bilgisi ile yaptığımız bağlantıdır.

Altarnate_01 isimli metotda görüldüğü gibi OrganizationServiceProxy nesnesi üretiyoruz ve bunu IOrganizationService olarak cast edip kullanıyoruz.

IOrganizationService ‘i ClientCredentials kullanarak OrganizationServiceProxy ile oluşturmak
IOrganizationService ‘i ClientCredentials kullanarak OrganizationServiceProxy ile oluşturmak.

İkinci yöntem; Alternate_02 isimli metodumuzda kullandığımız XrmTooling ile CrmServiceClient oluşturmak.

Bunun için projemize Microsoft.CrmSdk.XrmTooling.CoreAssembly bileşenini eklememiz gerekli. CoreAssemblies ‘de olduğu gibi NuGet üzerinden ilgili bileşenleri ekleyebilirsiniz yada Package Manager Console üzerinden Install-Package Microsoft.CrmSdk.XrmTooling.CoreAssembly komutunu çalıştırabilirsiniz.

CrmServiceClient, SQL connection string ifadelerine benzer şekilde, Dynamics 365 CE ‘e özel bir yapıda bağlantı bilgileri içerir.

İlgili connectionstring ‘lerin kullanım şekilleri için https://docs.microsoft.com/en-us/dynamics365/customerengagement/on-premises/developer/xrm-tooling/use-connection-strings-xrm-tooling-connect#connection-string-examples adresine bakabilirsiniz.

Bu bilgileri projemizin app.config ya da web.config dosyası içinde <connectionStrings> node altında ya da herhangi bir güvenli yapıda saklayabiliriz. Bu yazıda anlattığım örneklerde app.config kullanacağım.

Dynamics 365 CrmServiceClient connection string
Dynamics 365 CrmServiceClient connection string

Burada altını kırmızı ile reklendirdiğim Username ve Password alanları Dynamics 365 CE (CRM) ‘e bağlanmak istediğiniz kullanıcının bilgilerini içermektedir. username bilgisi kullanıcı@organizasyon.onmicrosoft.com formatında olmalıdır.

Connection bilgisi için tanımladığımız ad (name) bilgisini (örnek : D365TR_Sandbox), kodumuzda bu bilgiyi çağırmak için kullanacağız.

IOrganzationService ‘i CrmServiceClient kullanarak oluşturmak
IOrganzationService ‘i CrmServiceClient kullanarak oluşturmak

Alternate_02 metodumuzda görüldüğü üzere ilk olarak app/web.config dosyamızdan D365TR_Sandbox isimli connectionstring değerimizi okuyoruz. Bunun için projemizde using System.Configuration; namespace eklemesi yapmamız gerekli.

Sonrasında CrmServiceClient constructor ‘a bu connectionstring ‘i parametre olarak gönderiyoruz. Aslında işlemimiz burada bitiyor, çünkü CrmServiceClient tek başına bize birçok metot sunuyor ve direkt olarak Dynamics 365 CE (CRM) ile işlem yapmamıza imkan tanıyor.

Fakat projelerimizde IOrganizationService ‘e ihtiyaç duyabileceğimiz yerler olabileceği için kodumuzda CrmServiceClient.OrganizationServiceProxy ya da CrmServiceClient.OrganizationWebProxyClient property ‘lerini IOrganizationService ‘e cast ediyoruz.

CrmServiceClient ve desteklediği işlemler hakkında detaylı bilgiye https://docs.microsoft.com/en-us/dotnet/api/microsoft.xrm.tooling.connector.crmserviceclient?view=dynamics-xrmtooling-ce-9 adresinden erişebilirsiniz.

İki alternatif yöntem ile IOrganizationService nesnemizi oluşturduk, bu metotların proje içinde kullanımı aşağıdaki gibidir;

Örnek kodumuzda yer alan WhoAmIRequest Dynamics 365 CE SDK ‘da yer alan bir request yapısıdır ve o anda IOrganizationService ‘e bağlanmış kullanıcının bilgilerini WhoAmIResponse olarak döner. Yapmış olduğumuz bağlantı işlemlerini kontrol etmenin ve kullanıcıya ait bilgileri almanın en kolay yoludur.

WhoAmIRequest işlemi sonrasında dönen WhoAmIResponse bilgileri
WhoAmIRequest işlemi sonrasında dönen WhoAmIResponse bilgileri

Bunların dışında farklı bir alternatif olan Server-to-Server (S2S) Authentication kurgusunu başka bir yazıda detaylı olarak anlatacağım.

Dynamics 365 CE (CRM) OrganizationService bağlantı işlemlerinde unutulmaması gereken önemli noktalar aşağıdaki gibidir;

  • OrganizationService thread-safe değildir. Eğer uygulamanız multi-thread olarak çalışıyorsa, her bir thread kendine ait OrganizationServiceProxy oluşturmaktadır.
  • OrganizationServiceProxy constructor her çağrıldığında Dynamics 365 CE (CRM) tarafında 2 işlem yapılmaktadır;
    • Metadata download
    • Kullanıcı authentication işlemi

Bu 2 madde performans açısından önemlidir ve dikkate alınmalıdır.

Performans konusunda önerileri ve dikkat edilmesi gereken noktaları farklı bir yazıda detaylı olarak anlatacağım.


Başlangıçta belirttiğim gibi sonraki yazılarda geliştireceğimiz örnek projelerde de aynı bağlantı yapısını kullanabilmek için kodlarımızı bir helper proje içinde yeniden yapılandırdım.

Dynamics 365 CE ConnectionHelper
Dynamics 365 CE ConnectionHelper

Metotlarda gördüğünüz callerId parametresi bir sonraki yazımızın konusu. Hazırladığımız ConnectionHelper ‘ı projelerimizde aşağıdaki gibi kullanabiliriz;

ConnectionHelper kullanımı
ConnectionHelper kullanımı

Umarım faydalı bir yazı olmuştur.


Dynamics 365 CE (CRM) SDK konusunda ilgili tüm yazılara tek nokta üzerinden ulaşmak isterseniz http://www.emregulcan.com/dynamics365-sdk adresine bakabilirsiniz.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

This site uses Akismet to reduce spam. Learn how your comment data is processed.