cub-e.net

just coding...

Dynamics CRM Servis Mimarisi

Dynamics CRM üzerinde uygulama geliştirebileceğiniz çok güçlü bir mimari ile gelmektedir. Bu mimarinin temel yapı taşı ise WCF servisleridir. Bu yazımda sizlere CRM'in temel web servisleri olan Discovery ve Organization Servislerinin yapısını ve ne işe yaradıklarını anlatacağım.

CRM için kod geliştirirken her ne kadar sdk'nın içinden çıkan dll'leri kullansak da bu dll'ler vasıtasıyla ilk önce servis bağlantısı oluşturmamız gerekmektedir.  Yani verilere ulaşmak ve veri yazmak için WCF servislerini kullanmak zorundayız. Bu servislerle daha hızlı ve güvenli bir şekilde CRM platformuna entegre olmamızı sağlamaktadır.

WCF standartlaşmış bir teknoloji olduğu için biz yazılım geliştiricilere yeni özellikler sunmakta ve sürekli kendi içerisinde gelişmektedir. Dynamics CRM yapısında entity ve attribute katmanlı bir mimari bulunmaktadır. Yani biz CRM'in Business Logic katmanına müdahele edip yazılımlarımızı onunla entegre hale getirmekteyiz. Temel olarak nesne katmanı Entity isimli nesneden türemiştir. late-bound türlerde bu nesneyi sıklıkla kullanmaktayız. Early-bound olarak program geliştirme metodolojisini tercih edersek Entity class'ı ile işimiz olmamaktadır ama arka planda bütün nesnelerin bu class'dan türediği unutulmamalıdır. Bu konuya aşağıda bir örnekle tekrar değineceğim. CRM servislerine OrganizationServiceProxy ve DiscoveryServiceProxy sınıflarıyla bağlanmaktayız. Aşağıdaki kod bize bunu göstermektedir;

using (OrganizationServiceProxy _serviceProxy =
    new OrganizationServiceProxy(organizationUri, homeRealmUri, userCredentials, deviceCredentials)) ;

Discovery Servis

Dynamics CRM 4.0 versiyonundan itibaren multi-tenant bir mimaridedir. Yani tek bir uygulama birden fazla organizasyonu içerisinde barındırmaktadır. Yazılımcı olarak birden fazla organizasyon arasında geçiş yapmamız gerekiyorsa sistemde hangi organizyonlar olduğunu sorgulama işini Discovery servis ile yapmamız gerekmektedir. Bu servis yazma okuma işlemlerinin yapılacağı ana servise bağlanmamıza yardımcı olacak ve organizasyonların bilgisini bize döndürecektir. Aşağıdaki kod bize bu servise nasıl bağlanacağımızı ve organizasyonların bilgisine nasıl ulaşacağımızı göstermektedir.

Device ID bilgisini vermek istemezsek

Uri dInfo = new Uri("http://192.168.5.102/XRMServices/2011/Discovery.svc");
ClientCredentials clientcred = new ClientCredentials();
DiscoveryServiceProxy dsp = new DiscoveryServiceProxy(dInfo, null, clientcred, null);
dsp.Authenticate();
RetrieveOrganizationsRequest
rosreq = new RetrieveOrganizationsRequest();
RetrieveOrganizationsResponse
r = (RetrieveOrganizationsResponse)dsp.Execute(rosreq);
foreach
(OrganizationDetail o in r.Details)
{
      Console.WriteLine("Organizasyon Adı : " + o.FriendlyName);
}
Console
.ReadLine();

Device ID bilgisini vermek istersek

Normalde dokümantasyonlarda bu sekilde bir ayrim göremezsiniz. Ben bunu deneyimlerime dayanarak yapıyorum. Aslinda yukarıdaki kod da Online Organizasyon’a baglanir ama DiscoveryService’in varsayilan yapici metoduna 4. Parametreyi gönderirseniz yani DeviceCredential null olmazsa calisir.Sorun ise DeviceCredential’i oluşturmak icin CRM SDK\SampleCode\CS\HelperCode klasöründeki DeviceIdManager.cs kodunu kendi kodunuza implemente etmeniz gerekmekte.

Ek Bilgi

Bu kodla discovery servise bağlandıktan sonra ClientCredentials'ı kullanarak hali hazırda oturum açmış kullancının bilgisini sisteme göndermekteyiz. Ama her zaman bunu kullanmak istemeyebiliriz yani başka bir kullanıcı adı ve şifre ile sisteme girmek istediğimizde ClientCredentials'a kullanıcı adı, şifre bilgilerini verebiliriz.

clientcred.Windows.ClientCredential = new System.Net.NetworkCredential("kullanici adi", "sifre", "domain");

Yukarıdaki kodun çalışabilmesi için System.ServiceModel.Description,System.Runtime.Seriliazation, Microsoft.Crm.Sdk.Proxy ve Microsoft.Xrm.Sdk dll'lerinin referanslara eklenmiş olduğundan emin olun. Ayrıca uygulamayı .Net Framework 4.5.2'de derlemek gerekiyor.

Organization Servis

Dynamics CRM 2015'in ana web servisi Organization Servis'tir. Bu servis içerisinde entity instance'ları üzerinde işlem yapabileceğimiz 6 metod ve execute metodu bulunmaktadır. CRM Servis sınıfını oluşturabilmek için Organization Service Proxy'nin bir instance'ını oluşturmamız gerekmekte. Daha sonrasında ise Organization Servis sınıfını bunu göre ayarlayacağız.

Uri organizationUri = new   Uri("https:// !organizasyon crm url! /XRMServices/2011/Organization.svc");

ClientCredentials clientcred = new ClientCredentials();

clientcred.UserName.UserName = " kulllanici adi ";

cientcred.UserName.Password = " sifre ";

OrganizationServiceProxy _serviceproxy = new OrganizationServiceProxy(organizationUri, null, clientcred, null);

IOrganizationService _service = (IOrganizationService)_serviceproxy;Yukarıdaki kodun çalışabilmesi için System.ServiceModel.Description, Microsoft.Xrm.Sdk ve Microsoft.Xrm.Sdk.Proxy dll'lerinin referanslara eklenmiş olduğundan emin olun. Ayrıca uygulamayı .Net Framework 4.5.2'de derlemek gerekiyor. Oluşturduğumuz bu servisi daha sonra programımızın ilerleyen bölümlerinde çağırıp işlemler yapacağız.

Tabi burada belirtilmesi gereken bir konu da işlem yapmak istediğiniz nesnenin üzerinde yetkilerinizin olmasıdır. Bir kayıt oluşturabilmek için oluşturma yetkisine sahip olmanız gerekmektedir. Sadece okuma yetkisiyle bir kayıt oluşturamazsınız. Bir sonraki yazımda sizlere entity mimarisi ve yazma okuma işlemlerini anlatacağım.

Yukaridaki kod orneginde biz bir kullanici adi ve sifre ekledik. Eger her kullanicinin kendi kullanici haklariyla sistem üzerinde işlem yapmasini istiyorsaniz yukarıdaki kodda kullanici adi ve sifre kodunu silip asagidaki kodu eklemeniz gerekir.

ClientCredentials clientcred = new ClientCredentials();

Boylece sistemde oturum acmis kullanici bilgileri ile devam etmis olacagiz.

Bilmemiz gereken diğer bir konu da eger Early Bind veri tipi kullanacaksak servisi oluştururken ek bir komut daha girmemiz gerekmektedir. Yani linq ile sorgulama ve generated code üzerinde işlemler yapabilmek icin oluşturduğunuz servis nesnesine bu sekilde işlem yapacaginizi belirtmeniz lazim iste bunun icin asagidaki satiri eklememiz gerekmekte.

_serviceproxy.EnableProxyTypes();

Bu arada CRM servisi olusturmanin yeni bir yöntemi daha bulunmakta. Bu da CrmConnection nesnesini kullanmak. Bu nesneye erişebilmek icin Microsoft.Xrm.Client dll’ini referans olarak eklemeniz gerekmekte.

CrmConnection crmConnection = CrmConnection.Parse("Url=https://! Crm organizasyon url !/XRMServices/2011/Organization.svc; Username= kullanici adi; Password= sifre");

OrganizationService service = new OrganizationService(crmConnection);

Boylece servis oluşturma işlemini 2 satirda da halledebilmekteyiz. Tabii bu bilgileri ben bu sekilde kod içerisine koymus gibi oldum size gostemek icin ama projelerde tabii ki bunlari ya app.config, web.config içerisine ya da belli bir lokasyonda tuttuğumuz xml dosyasi içerisinde tutuyoruz ki bu bilgiler degistiginde sürekli kod degisikligi yapmak zorunda kalmayalım.

Plug-in'i Debug Etmek

CRM 2015 icerisinde yazmis olduğumuz bir plug-in’i debug etmenin iki temel yolu bulunmakta. Birinci yol calisan sisteme visual studio ile attach olarak yapilan, ikinci yol ise plug-in profiller kullanmak. Profiller icin Microsoft dokümantasyonlarda plug-in performansini ölçmek icin kullaniliyor dese de aslinda 1. Yöntemden daha saglikli olduğunu söyleyebilirim. Ozellikle Online sistemler icin başka çareniz de yok zaten.

Servis’lere Attach olarak Debug Etme

Plug-in’i sisteme kaydettikten sonra visual studio ile nereye attach olacagimizi seçmemiz gerekmekte.

 

Kayit Ayari

Servis

online

w3wp.exe

offline

Microsoft.Crm.Application.Hoster.exe

asynchronous olarak kaydedilmis plug-in’ler (ya da custom workflow’lar)

CrmAsyncService.exe

sandbox (isolation mode)

Microsoft.Crm.Sandbox.WorkerProcess.exe

 

Online : CRM Web arabirimini

Offline : Outllok Client gibi offline yapidaki yazilimlar

 

Kendimize uygun olan secimi yaptıktan sonra geriye bir tek breakpoint’i seçip attach olmak kaliyor.

 

Visual Studio’yu acip “Attach to Process..” diyoruz.

 


Sonra asagidaki ekran goruntusu gelecek ve ilgili servisi seçeceğiz.

 

 


Asagidaki ekran goruntusunde de goruldugu uzere visual studio ilgili yerde devreye girecek ve bizim kodu debug etmemizi saglayacaktir.


 

Islem bu kadar basit sadece dikkat etmeniz gereken noktalar bulunmakta;

1.       Eger disk’e yaz adimini seçerek plug-in’i sisteme kayit ettiyseniz bu plug-in’in debug modda yeni bir versiyonunu ayni dizine kopyalamak icin plug-in üzerinde calistigi servisi yeniden baslatmaniz gerekir.

2.       Plug-in üzerinde değişiklikler yaptiginizda her seferinde registration tool’u ile güncelleme islemini yapin.

3.       Eger plug-in’i bu sekilde test edip butun işlemleri bitirdiyseniz onu veritabanina kaydetmenizi tavsiye ederim. Disk olarak birakmaniz pek önerilen bir yöntem değildir.

4.       Her ne olursa olsun .pdb uzantili dosyalari assembly klasörü içerisinde birakmayin.

5.       Sandbox içindeki bir plug-in’i debug etmek istiyorsaniz asagidaki registery ayarinin 1 (DWORD) değeri tasidigindan emin olun : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM\SandboxDebugPlugins

Plug-in Profiller’i kullanarak Debug etme

Bu yöntemi kullanmak birçok bakimdan daha avantajli nedeni ise CRM size kullanicinin yaptigi hareketi simule ediyor ve böylece siz bunun üzerinden debug ediyorsunuz. Ayrica ciktilari baskalarina gönderme opsiyonu da bulunmakta. En değerli ozelligi ise plug-in’i derleyip derleyip CRM’e atmak gibi bir derdiniz yok. Yani bir hata mi yakaladiginiz ya da kodun bir yerini mi değiştirmek istiyorsunuz tek yapmaniz gereken degisikligi yapip uygulamaya yeniden bağlanmak ayni kullanici hareketi tekrar simule edilecek ve siz de yaptiginiz degisikligin etkilerini göreceksiniz.

 

Simdi sirasiyla bu işlemi nasil yapacagimiza bakalim. Oncelikle “Plug-in Registration Tool”’u aciyoruz ve işlem yapmak istediğimiz organizasyonu seçiyoruz.

Tool üzerindeki “Install Profiller” düğmesine tikliyoruz. Boylece “Plug-in Profiller”’da listemizde gozukmeye basliyor.

Daha sonra test etmek istediğimiz step’i seçiyoruz ve yine toolbar’da yer alan “Start Profilling” düğmesine basıyoruz. Karsimiza asagidaki gibi “Profiler Settings” ekrani cikiyor.

 

 

Bu adimda iki secenekten birini seçmeniz lazim.

·         Exception: Microsoft, Exception yöntemini önermekte gordugunuz gibi. Bunun anlami ise su kullanici ya da siz plug-in’i tetikledeginizde plug-in calisacak ve sistem size bir hata mesaji gösterecek. Bu hata mesaji içerisinde plug-i debug etmemize yarayacak bilgiler yer alacak. Bu bilgileri almak icin cikan hata penceresinde “Download Log File” düğmesine basmaniz gerekmekte.

 

·         Persist to Entity: Eger ikinci adimi seçerseniz bu sefer butun bilgiler CRM içerisinde bir Entity içerisine yazılacak.

 

Iki adimdan birini seçip plug-in’i tetikleyecek işlemi yaptıktan sonra “Plug-in Registration Tool” içerisinde “Debug” düğmesine tiklamaniz gerekmekte.

 

 

Karsiniza asagidaki gibi bir ekran gelecek. Bu ekran bir önceki seçtiğiniz adima gore iki işlemden birini yapmaniz gerekmekte;

 

Eger “Exception” adimini seçtiyseniz “…”’ya basarak kaydetmiş olduğunuz hata dosyasinin yerini gösterin. Eger “Persist To Entity” adimini seçtiyseniz asagi doğru duran ok düğmesine basiniz. Karsiniza soyle bir ekran cikacak;

 

 

Bu ekrandan kaydettiğiniz profile log’unu seçebilirsiniz.

 

Sonra sirasiyla .dll dosyanizi sisteme gösterin ve debug etmek istediğiniz Plug-in’i secin. Visual Studio’yu acin ve “PluginRegistration.exe” uygulamasina attach olun. Start Execution dugmesina basin ve breakpoint koyduğunuz yerde bekleyin. Bir sure sonra Visual Studio’a beklediğimiz yere gelecek ve bizim debug etmemizi sağlayacak.

 

 


Eger plug-in’de değişiklik yapmaniz gerekiyorsa değişiklikleri yapin ama CRM’e atmayin ilk once biraz önceki adimlari uygulayarak kodu tekrar test edin. Artik koddan eminseniz CRM içerisine gönderebilirsiniz güncellediğiniz .dll’i.

 

Bu arada belirtmeliyim ki asagida “plug-in traces” bolumunden de debug etmeden kodun nasil calistigini izleyebilirsiniz.



Burada icin TracingService ile yazacaginiz mesajlar görüntülenecektir.

Dynamics CRM Webinerleri

İşte size büyük süpriz. 8 gece CRM konuşacağız. Detaylar aşağıda :)

 “İş stresinden ve günün yorgunluğundan kurtulun. Microsoft Dynamics CRM MVP’si Barış KANLICA sizi CRM’li 8 geceye davet ediyor.
Microsoft Dynamics CRM’in yeteneklerini, iş gücünü, her firmaya yaptığı işe göre uyarlanabilen esnek mimarisini keşfetme zamanı; şimdi CRM zamanı.
Siz rahatlayın ve arkanıza yaslanın bırakın o sizin yerinize çalışsın. İş akışları sayesinde sizin yerinize otomatik görevler oluştursun, mailler atsın. Dahası her yerden CRM’e ulaşın.
21:00-22:00 saatleri arasında yapılacak olan web seminerimize hepiniz davetlisiniz. ” 
Tarihi Konusu İçerik Link Başlangıç Saati Bitiş Saati
(Duyuruda kullanılacak başlık)
20.01.2010 CRM,XRM Kavramları ve MS Dynamics CRM CRM'in temelleri ve işleyişi anlatılacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440131&Culture=TR-TR 21:00 22:00
22.01.2010 Dynamics CRM Genel Ayarlar, Sistemin Yetenekleri ve İş Akışları Dynamics CRM'in yetenekleri ve İş Akışları mimarisi anlatılacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440133&Culture=TR-TR 21:00 22:00
27.01.2010 Dynamics CRM Firmalar, İlgili Kişiler ve Outlook Client Dynamics CRM içerisinde kayıtların nasıl durduğu ve bunlara nasıl erişileceği bu webinerde anlatılacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440135&Culture=TR-TR 21:00 22:00
29.01.2010 Dynamics CRM Satış Yönetimi I - Ürün Yönetimi, Fırsat Kavramı ve Müşteri Adayları Dynamics CRM içerisinde CRM kavramına yönelik yapıların nasıl şekillendiği bu webinerde anlatılacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440138&Culture=TR-TR 21:00 22:00
03.02.2010 Dynamics CRM Satış Yönetimi II - Teklif, Sipariş ve Fatura Satışa yönelik aktivitelerin Dynamics CRM içerisinde nasıl yönetildiği bu webinerde ele alınacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440140&Culture=TR-TR 21:00 22:00
05.02.2010 Dynamics CRM Pazarlama - Kampanya ve Kampanya Raporları Kampanyaları yönetmenin Dynamics CRM ile ne kadar olduğu bu webinerde anlatılacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440142&Culture=TR-TR 21:00 22:00
10.02.2010 Dynamics CRM Servis - Sözleşme, Servis Talepleri ve Servis Planlama Dynamics CRM içerisinde servis planları oluşturmanın, Servis ekibi ve ekipmanlarının yönetimi bu webinerde anlatılacaktır. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440144&Culture=TR-TR 21:00 22:00
12.02.2010 Dynamics CRM Gelişmiş Bul ile Herşeyi Bulalım ve Kendi Raporlarımızı Yapalım Dynamics CRM ile bütün alanlarda sorgulama yapın, görünümler oluşturun, Excel ve Word'e aktarın hatta kendi raporunuzu birkaç tıklama ile yapın. http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032440146&Culture=TR-TR 21:00 22:00

CRM Live Re-Named to CRM Online - CRM Live adı CRM Online olarak değiştirildi

Microsoft host edilen CRM Servislerinin adında bir değişikliğe gitti. Artık adı Dynamics CRM Live değil Dynamics CRM Online olacak.

---

Microsoft has announced a name change to their hosted CRM service. The service, now known as Microsoft Dynamics CRM Online is still targeted for a Q2 release.

Bill Patterson, Microsoft's Director of Product Management for the hosted service said in a communique:

"In recent months, Microsoft has launched the new Online brand, with tremendous investment in and focus around on-demand technology for business users. Whereas the Live brand is focused on consumers and small businesses, the Online brand is fully aligned with our existing Microsoft Dynamics CRM strategy of delivering outstanding solutions for small businesses, midsized companies, and large enterprises. As a result, we will be launching the new service as Microsoft Dynamics CRM Online."

 

Microsoft Dynamics CRM Hatalarını Yakalamak

CRM web servisi bir web servisinin doğası gereği soap ile iletişim kurmakta ve işlenen hataları da soap içinde xml ile döndürmektedir.


Microsoft Dynamics CRM Web Servisi'nde Request parametresi kullanılarak bir çağrı yaptığınızda hata olarak System.Web.Services.Protocols.SoapException sınıfından ortak bir hata mesaj yapısı döner.

SoapException'ın Message property'si her zaman için "Server was unable to process request." hatasını döndürür.

SoapException içerisinde Detail property'si oluşmuş olan hata hakkında daha fazla bilgi verecektir. Detail property bir XmlNode türündendir ve InnerXml property aşağıdaki formatta hatayı sunmaktadır.

<error>
<description>Error description goes here.</description>
<code>0xABCD1234</code>
<type>Platform</type>
</error>
 

ErrorCode yani xml içerisindeki Number hexadecimal türündedir. Örnek verecek olursak; eğer veritabanında olmayan bir fax'ı çağırmaya kalkalsanır hata aşağıdaki şekilde olacaktır:

<error>
<code>0x80041103</code>
<description>'Lead' entity doesn't contain attribute with Name = 'name'.</description>
<type>Platform</type>
</error>

Standart bir kodlama mantığında catch bloğunda bu hatayı aşağıdaki şekilde yakalabiliriz.

catch (System.Web.Services.Protocols.SoapException ex)
{
   
Message = ex.Message;
   
Detail = ex.Detail.InnerText;
}

Bu şekilde hatayı öğrenebiliriz ama detaylı ve güzel bir hata mesajı olmaz son kullanıcı için. Tabii burada bu hataları loglayacak bir yapı oluşturabiliriz bu tercihinize kalmış ama her durumda detaya ihtiyacımız var.

CRM'in detaylı hata kod listesine buraya tıklayarak ulaşabilirsiniz.

Hata yapısı ve içeriği hakkında bu bilgileri verdikten sonra bu hataları yakalayacak kodu vermek güzel olacak sanırım :) Aşağıda kodu ve açıklamasını bulabilirsiniz.

 

/// <summary>
///
Hatalari yakaliyoruz.
/// </summary>
/// <param name="ex">System Exception</param>
/// <returns>hatanin detayli aciklamasi</returns>
private string HandleException(Exception ex)
{
   
string Error = "Uygulama bir hata ile karsilasti." + System.Environment.NewLine;
    Error +=
"Message : " + ex.Message + System.Environment.NewLine;
   
if (ex.InnerException != null)
        Error += ex.InnerException.Message + System.
Environment.NewLine;
   

    SoapException
se = ex as SoapException;
   
if (se != null)
    {
        Error +=
"Code : " + GetError(se.Detail, "//code") + System.Environment.NewLine;
        Error +=
"Desription : " + GetError(se.Detail, "//description") + System.Environment.NewLine;
        Error +=
"Type : " + GetError(se.Detail, "//type") + System.Environment.NewLine;
    }
   
return Error;
}

/// <summary>
/// SoapException.Detail icerisindeki hatayi dondurur
/// </summary>
/// <param name="errorInfo">hatayi iceren XmlNode'u.</param>
/// <param name="item">geri dondurulecek hata.</param>
/// <returns>hata detayi ya da bos icerik.</returns>
private string GetError(XmlNode errorInfo,string item)
{
   
XmlNode code = errorInfo.SelectSingleNode(item);
   
if (code != null)
   
    return code.InnerText;
   
else
        return
"";
}
  1. Burada dikkat edilmesi gereken şey hatanın SoapException sınıfı türünden olup olmadığını kontrol ettiğimiz kısım;

        SoapException se = ex as SoapException;

    eğer içerik SoapException türünden ise detayını öğrenmek isityoruz. ( "as" ifadesi hakkında daha fazla bilgi almak için buraya tıklayınız.)
  2. Yukarıda hata durumunda dönecek Xml içeriğini verdim. Bu bir Xml olduğu için XmlNode'larına erişerek istediğimiz bilgiyi alalım. İşte GetError bu işe yarıyor. Soap Exception'ın Detail'ını ve istediğimiz node'u söylüyoruz bize geri dönüyor.

        GetError(se.Detail, "//code")

Bu kod sonucunda elde ettiğimiz hata mesajı;

 

Uygulama bir hata ile karsilasti.
Message : Server was unable to process request.
Code : 0x80041103
Desription : 'Lead' entity doesn't contain attribute with Name = 'name'.
Type : Platform

 

Bir makalemizin daha sonuna geldik umarım faydalı olmuştur.


Barış KANLICA

Yazılım Uzmanı – Software Specialist
brsk@e-kolay.net
www.cub-e.net
forum.cub-e.net

Microsoft Dynamics CRM Web Servisi ve Performans

Benim yazılarımı takip edenler hatırlayacaklardır. Daha önce CRM üzerinde veri sorgulama yöntemleri isimli yazı dizimin 1. bölümü web servislerini kullanarak veri sorgulama yöntemleriydi. O makalede web servisleri hakkında bilgi vermiştim ama şimdi CRM 4.0 çıkınca, CRM 4.0'ın web servisinin ek özelliklerini anlatmak ve performans konularına değinmek istedim.

CRM Web Servisi performans düşüklüğü nedeniyle programcılar tarafından pek sevilmemektedir. Bu makalede sizlere web servisin yapısını ve performans attırıcı bir yöntemlerden bahsedeceğim. Ayrıca CRM 3.0 ve 4.0 arasındaki servis yapısındaki değişikliklere göz atacağız.

WebServis’leri ise bize özellikle veri yazarken büyük kolaylıklar sağlasa da veri okurken bazen karışık olabiliyor. Web Servisleri class(sınıf) mimarisinde olduğundan nesne paylaşımına dayalı bir altyapı sunuyor. Bu doğru kullanıldığında, bize, program yazarken uzun uzun attribute ve property hazırlamak derdinden kurtarıyor.

Microsoft CRM’in 2 adet temel Web Servisi bulunmakta;

  1. CRM Service : istediğiniz entity üzerinde Create(Oluşturma),Update(Güncelleme) , Delete(Silme) gibi işlemleri yapmanızı sağlıyor. Adresi;
    CRM 3.0 : http://<yourservername(:port)>/mscrmservices/2006/crmservice.asmx
    CRM 4.0 : http://<yourservername(:port)>/mscrmservices/2007/crmservice.asmx
    alternatif olarak http://<yourservername(:port)>/MSCRMServices/2007/CrmServiceWsdl.aspx
  2. Metadata Service : CRM’in entity ve picklist mimarisi gibi metadata veritabanında bulunan veriler üzerinde yine Create(Oluşturma),Update(Güncelleme) ,Delete(Silme) gibi işlemleri yapmanızı sağlıyor. Metadata verisi içerisinde bir picklist(yani combobox-dropdownbox)’in içeriği, bir alanın türü gibi sistem üzerinde kullandığımız nesnelere yönelik bilgileri tutmaktadır. Adresi;
    CRM 3.0 : http://<yourservername(:port)>/mscrmservices/2006/metadataservice.asmx
    CRM 4.0 : http://<yourservername(:port)>/mscrmservices/2007/metadataservice.asmx

Web Servisini Projemize Eklemek :



Visual Studio’da açtığımız uygulamamızın adı üzerinde sağ tuşa tıklayarak getirdiğimiz menüde aşağıdaki gibi “Add Web Reference”’a tıklıyoruz.


Açılan pencereye eklemek istediğimiz servisin url’ini yazıyoruz ve “go” düğmesine tıklıyoruz.

Servis credential yani kimlik doğrulamak için bizden kullanıcı adı ve şifre isteyecek. Bunu geçtikten sonra “Web reference name”’e servise verecegimiz ismi yazıyoruz. Burada ben “MyService” ismini veriyorum. “Add Reference” düğmesine tıklıyoruz.Artık servisimizi projemize eklemiş durumdayız.

  1. CRM servisimizin oluşturuyoruz.

            CrmService MyService = new CrmService();

  2. Servise network'te kim olduğumuzu söyleyelim eğer CRM serverın bulunduğu domainde oturum açmadıysak bunu yapmak zorundayız.

            System.Net.
    NetworkCredential MyCredential = new System.Net.NetworkCredential();
            MyCredential.UserName =
    ""
            MyCredential.Password = "";
            MyCredential.Domain =
    "";
            MyService.Url =
    "http:// i p : port/MSCrmServices/2007/CrmService.asmx";
            MyService.Credentials = MyCredential;

    Bu kod ile servise bağlandığımız zaman sistem üzerinde yaptığımız bütün hareketlerde yani güncelleme ve kayıt işlemlerinde burada vereceğiniz kullanıcı adı ve şifrenin ait olduğu kullanıcı created ve modified user olarak gözükecektir. Yani sistemde bizim uygulamamzı kullanan bütün kullanıcıları teke indirmiş olacağız.
    Bunun olmasını istemiyorsak aşağıdaki kodu kullanmamız gerekir;

        MyService.Credentials = System.Net.CredentialCache.DefaultCredentials;

    Bu kod sayesinde IIS üzerinde Integrated Windows Authentication ile oturum açmış olan kullanıcıyı yani CRM'e girmiş olan kullanıcının yetkileri ile işlem yapmış oluruz. Burada hatırlanması gereken en önemli şey uygulamamızın işlem yaptığı entityler üzerinde kullanıcının yetkilerine göre web servisin bize cevap vereceğidir.
  3. işte burası servisi hızlandırdığımız nokta. Nasıl mı oluyor adı üzerinde aslında güvensiz bağlantı paylaşımı yani yukarıda bahsettiğimiz güvenlik yöntemlerinden biri ile IIS üzerinde oturum açan bir kullanıcı olduğu zaman IIS talepte bulunan diğer kullanıcılar için doğrulama yapmıyor yani Kerberos devreye girmiyor Active Directory'e gidilmiyor. Bunlar sonucunda performansta gözle görülür bir artış oluyor.

            MyService.UnsafeAuthenticatedConnectionSharing = true;

    Ama işte burası önemli aması var :) sisteme ilk kim giriş yaparsa IIS o kullanıcı ile devam ettiğinden her işi sanki birinci kullanıcı yapmış gibi görünüyor. CRM'in performansını arttırmakla ilgili daha detaylı makalelere bu linkten ulaşabilirsiniz : Performans Arttırmak
  4. CRM 4.0 bildiğiniz gibi farklı hosting modelleri ile birlikte geliyor. Tabii bu hosting modellerini programatik olarak da kontrol etmek gerek. Artık crm serverine bağlanırken bir AuthenticationToken'a ihtiyacımız var bu olmadan servis bağlantı yapmanıza izin vermeyecektir.
    Token nesnesi içerisinde bulunan AuthenticationType isimli Property 0,1,2 değerlerinden birini almaktadır. Bunların anlamları ise;

    Alan Değer Tanım
    AD 0 Standart Active Directory authentication.
    Passport 1 Passport authentication. Şu an için Amerika ve Kanada'da kullanılacak olan windows live id ile Microsoft tarafından yapılacak olan hostinglerde geçerli olacak.
    Spla 2 Specifies Internet Facing Deployment authentication (formerly known as SPLA). Firmanızının CRM hosting yapacağı zaman kullanacağınız doğrulama biçimi.

    Bütün bunların yanında hosting yapsanız da yapmasanız da kullanmanız gereken bir property var adı OrganizationName. Hangi CRM organization için sisteme giriş yaptığınızın bilgisidir.

            CrmAuthenticationToken token = new CrmAuthenticationToken();
            token.AuthenticationType = 0;
            token.OrganizationName = "CRMVPC";
            MyService.CrmAuthenticationTokenValue = token;

private
CrmService service(bool isUnsafe)
{
   
try
    {
       
CrmService MyService = new CrmService();
       
// servise network'te kim oldugumuzu soyluyoruz. (Eger CRM Server'i ile ayni domainde degilseniz
        // bunu yapmak zorundasiniz yoksa "The request failed with HTTP status 401: Unauthorized." hatasini alirsiniz)
        System.Net.NetworkCredential MyCredential = new System.Net.NetworkCredential();
        MyCredential.UserName =
""
        MyCredential.Password =
"";
        MyCredential.Domain =
"";
        MyService.Url =
"http:// i p : port/MSCrmServices/2007/CrmService.asmx";
        MyService.Credentials = MyCredential;
       
// Eger crm server ile ayni domainde iseniz ve sizin crm'de bir rolunuz varsa asagida parantezler icerisinde
        // belirttigim komutu yukaridaki 5 satir yerine kullanabilirsiniz
        // ( MyService.Credentials = System.Net.CredentialCache.DefaultCredentials; )
       
        // servisi hizlandirmak icin true degerini atiyabiliriz.
        MyService.UnsafeAuthenticatedConnectionSharing = isUnsafe;
       
        ///
CRM 4.0 ile gelenler

        CrmAuthenticationToken token = new CrmAuthenticationToken();
        token.AuthenticationType = 0;

        token.OrganizationName = "CRMVPC";
        MyService.CrmAuthenticationTokenValue = token;

        return
MyService;
    }
    catch (Exception ex)
    {
        HandleException(ex);
        return null;
    }
}

Bir makalemizin daha sonuna geldik.


Barış KANLICA
Yazılım Uzmanı – Software Specialist
brsk@e-kolay.net
www.cub-e.net
forum.cub-e.net   

Reference Keys

Erikli Su-Nestle Waters Türkiye, Erben Kontrol Sistemleri, SaatveSaat, Siemens Ankastre, Kont Bilgisayar / BT Kurumsal, Houghton Kimya,  Teknolojix Mağazaları (Sönmez Holding), American Life, Kiler Hipermarketleri

CRM, Call Center, Çağrı Merkezi, Turkcell, Dynamics CRM, Mikro, IVR, CTI, bayi, satış, SMS, proje, anket, müşteri memnuniyeti