cub-e.net

just coding...

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   
Loading