cub-e.net

just coding...

Müşterinin Kalbine Giden Yol Teknolojiden Geçer - Bolum 1

Bizde meşhur bir atasözü vardır “erkeğin kalbine giden yol midesinden geçer” derler. Günümüzde bu sözü iş dünyasına odakladığımızda müşterinin kalbine giden yolda teknolojisinin olması bizi hiç de şaşırtmamalı aslında.

Rakamlar yalan söylemez…

Apple’ın 10 Eylül’de tatnıttığı  iPhone 5c ve iPhone 5s  bir haftada şimdiye kadar bütün iPhone’ların ilk hafta satışlarını geçti. Apple yaptığı açıklama ile bir haftada 9 milyon iPhone 5C ve iPhone 5S satıldığını duyurdu. iPhone 5 ile karşılaştırdığımızda geçen sene yine Eylül ayında tanıtılan iPhone 5 ilk haftasında 5 milyon rakamına ulaşmıştı.

Geçen sene tek ürünle 5 milyonu yakalamasına karşılık 2 ürünle toplamda 9 milyon satışa ulaşmış oldu.

Mobil kullanım oranları her geçen gün artıyor ve yapılan araştırmalar daha uzun süre bu büyümenin devam edeceğini öngörüyor. IDC‘nin yayınladığı rapora göre tablet bilgisayarlar, kişisel bilgisayarların yıllık üretimini 2015 sonu itibariyle geçecek.

Akıllı telefonlar ve tabletlerin bulunduğu mobil cihazlarda geçen yıl %30.3 büyüme yakalamasına göre bu yıl hafif bir gerileme ile %27.8 büyüme bekleniyor. Buna karşın PC üretiminin 2013 yılı itibari ile %10 düşeceği tahmin ediliyor. Akıllı telefonların anormal büyümesini sürdüreceği ve 1.4 milyar akıllı telefonun üretiminin gerçekleşeceği de beklentiler arasında. Dikkat çeken bilgilerden birisi de tabletlerin en büyük rakibinin yine mobil bir cihaz olan akıllı telefonların büyüyen ekranları olması.

Şirket websitesini yaptık herşey bitti…

Hal böyle olunca oturup düşünmek gerekiyor, peki biz işimizi teknolojiye uyarlayabildik mi? ya da internet ve sosyal medyanın gücünü doğru kullanabiliyor muyuz? İşte bu noktada en çok yapılan hata şirket web sitemizi yaptık herşey bitti şeklindeki yanlış düşüncede yatmakta. Türkiye’den örnek verecek olursak IAB Türkiye’nin sunduğu rapora göre ‘display’, arama raporu, mobil reklam, ilan, e-posta, oyun içi reklam gibi oluşan internet reklam yatırımları toplamına göre 2013’ün ilk 6 ayında internet reklam pazarı hacmi yarım milyar TL’yi aşarak 541.8 milyon TL olarak gerçekleşti.

2015 Yılı CRM Trendleri - Bolum 1

Nereden geldik…

Teknolojinin inanılmaz bir hızla ilerlediği dünyamızda insana dair olan her şeyde mecburen teknoloji ile bağlantı kurmak zorunda kalıyoruz. Şu anda birçoğumuzun kullandığı cep telefonların en eskisi eminin en iyi tahminle 3 yıllıktır. Bu teknolojik gelişim bizim her alanda karşımıza çıkmakta ve kavramları da şekillendirmekte. Yaklaşık 10 sen önce en iyi cep telefonunun en küçük en hafif telefon olduğu halk tarafından kabul görürken şu anda ekranı en büyük en hızlı internete giren pili en çok giden gibi kıyaslama ölçüleri ortaya çıktı. Bunun nedeni de insanların telefon üzerinde yapabildiklerinin günümüzde bilgisayara eşit hale gelmesine bağlamak gerekir.

Aynı açıdan bakarsak bundan çok değil 5-7 yıl önce en yeni ve en hızlı pazarlama aracı SMS yani kısa mesaj göndermekti. Kısa mesaj hala yaşamına devam etse de firmaların müşterilerine ulaşmak için gönderdikleri SMS oranları o kadar çılgın boyutlara ulaştı ki devlet bu işe sınırlama getirmek zorunda kaldı ve izinli pazarlama yöntemi ortaya çıktı. 

Nereye gidiyoruz…

Kullanıcı elektroniğindeki bu gelişmeler doğal olarak yazılım dünyasına da yansımakta. Facebook internet üzerinden fotoğraf ve resim hizmeti Instagram için 1 milyar dolar ödeyerek satın almıştı. Yine Facebook, 450 milyon aktif kullacısı ve 55 çalışanı olan WhatsApp'ı, 3 milyar doları tedbirli hisse olmak üzere 19 milyar dolara satın alarak, her bir kullanıcıya 42 dolar değer biçti. Peki Facebook’un kendisi nedir? Sonuçta o da bir yazılım ve reklamlar üzerinden gelir sağlayan bir modeli var aynı Google gibi. Kısacası öyle bir dünyada yaşıyoruz ki bir Whatsapp Türkiye’nin sanayi devlerinden 4 tane Tüpraş’a eşit.

Türkiye’de ise internet kullanım oranı 9 yaşına kadar düştü ve Türkiye’deki evlerin %60’ı aktif olarak internete bağlı durumda.

Şekil 1 - Kaynak TÜİK

Hal böyle olunca CRM gibi kavramlarda bütün bu teknolojik gelişmelerden nasibini fazlasıyla almakta ve bu kavramların geleceği de bu teknolojik gelişmeler karşısında şekillenmekte. Daha önce de ifade ettiğim gibi bundan 5-7 sene önce son kullanıcıya ulaşmak ve ürün ve hizmetler hakkında bilgi vermek ve müşteri ile interaktif işler yapabilmek için SMS en iyi araç gibi görünüyordu. Gelin 2015 itibariyle CRM dünyasının trendleri neler olacak bu teknolojik gelişmeler bizi nereye götürecek bunlara bakalım.

2015 Yılı Trendleri

1.      Online Sistemler ve Tablet Uygulamaları

CRM dünyasından geçen seneden beri en çok öne çıkan konulardan biri artık Cloud Computing (Bulut Bilişim) üzerine yerleşmiş sistemleri kiralamak ve kullanmak oldu. Biliyorsunuz ki teknoloji çok hızlı ilerliyor ve özellikle şirketlerin bu hız karşısında donanımsal ihtiyaçları ve internet, soğutma gibi altyapı ihtiyaçlarını karşılaması buna uygun yazılım alması ve belki de en önemlisi bu yazılımları ve donanımı ayakta tutacak uygun personeli/personelleri tutması çok yüklü maliyetler olmaya başladı. İşte bu nedenle Salesforce, Dynamics CRM gibi CRM yazılımları internet tabanlı hizmetlerinde çok büyük ataklar yaptılar. Bu sistemleri hem tek başlarına online hem de mevcut altyapınızla entegre olacak şekilde hybrid bir mimaride kullanabilmektesiniz.

Ayrıca bu online sistemler tablet ürünleriyle de (Ipad, Android, Windows Tablet) tam entegre bir şekilde çalışmakta ve bir bilgisayara ihtiyaç duymadan sadece bir tablet ile sistemleri tam entegre kullanabilmektesiniz.

2015 yılı ve gelecek yıllar saha personellerinin sadece ellerinde tabletler ile güçlü CRM altyapılarına bağlandıkları ve hiçbir ek sisteme gerek kalmadan bütün veri girişi ve raporlama altyapılarını sağlayabildikleri yıllar olacak. Kısacası bu dönemden sonra artık bilgisayarlar değil tablet ve cep telefonu tarafında olanlar sahadan gelen verileri hızlıca izleyip analiz edip müşteri ihtiyaçlarını karşılayabilir hale gelecekler.

2.      Mobil Dizayn

Geçen seneden bize miras kalan bu kavram hala geçerliliğini sürdürmekte. Önceki yıllarda bu kavram her cihaza uygun web sitesi tasarımı şeklindeydi. Yani ben bir şirketin web sitesine girdiğimde bilgisayardan mı yoksa tablet veya cep telefonundan mı girdiğimi algılayacak ona göre dizayn değiştirecek ki ben de buna göre sitede rahatça gezebileceğim. Artık bu durum daha farklı bir yöne kaydı; artık her firma kendi mobil uygulamasını yapmakta. Bu sayede kullanıcının direkt cep telefonun ya da tabletinde kullanıcının izin verdiği ölçüde her şeye erişim hakkı olmakta. Biliyorsunuz ki Whatsapp sözleşmesi gereği sizin telefonunuzda kayıtlı kişiler listesine erişme hakkına sahip. Bu hakkı siz ona uygulamayı kurarken kabul ettiğiniz lisans sözleşmesinde veriyorsunuz ve Whatsapp bu veriyi alıp istediği gibi değerlendirebilir. İşte mobil uygulama kavramı bu yüzden çok önemli.

Olayı Türkiye düzeyine indirgersek mobil cihaz kullanım oranına bakınca firmaların neden bunun için savaş verdiğini çok daha iyi anlayacaksınız.

 

Masaüstü bilgisayar
Desktop computer

Taşınabilir bilgisayar (Laptop, Tablet PC)
Portable computer (Laptop, Tablet PC)

Taşınabilir bilgisayar (Dizüstü, tablet, netbook vb)
Portable computer (Laptop, netbook, tablet)

Tablet bilgisayar
 Tablet computer

Cep telefonu (Akıllı telefonlar dahil)
Mobile phone (incl. smart phone)

 

 

 

Yıl
Year

2014

27.6

 

40.1

-

96.1

 

Kısacı şu anda bırakın cep telefonunu tablet kullanım oranı bile masaüstü bilgisayarların 2 katına ulaşmış durumda. Doğal olarak firmaların müşterileriyle iletişime geçmek, kullanıcı deneyimi öğrenmek, ürün kullanım oranları üzerinde analiz yapabilmek ya da müşteri şikâyetlerini almak için mobiliteye önem vermesi ve CRM analizlerini bunun üzerinden de veri toplayacak şekilde geliştirmeleri 2015 ve sonrasında artarak devam edecek.

2015 Yılı CRM Trendleri - Bolum 2

Yazimiza kaldigimiz yerden devam ediyoruz. 1. Bolumu okumak icin buraya tiklayabilirsiniz,

3.      Sosyal Medya Entegrasyonu

Sosyal medya artık hayatımızın vazgeçilmez bir parçası haline geldi ve inanılmaz bir hızla da büyümeye ve Pazar payını arttırmaya devam ediyor. Bu internet şirketleri size sadece internet tabanlı içerikler sunarken aldıkları reklamlar üzerinden kendilerini finanse etmekte ve inanılmaz bir şekilde insanlar tarafından kabul görmekte. Yazının başında bahsettiğim Facebook ve diğer örnekler olan Twitter,Youtube, Instagram, Google bunların başında gelmekte. Kullanıcıların dilek, şikayet ve önerilerini bu mecralarda dile getirmesi doğal olarak firmalarında bu havuzdaki veriyi takip edip müşteri odaklı sonuçlar ortaya çıkarmasına neden oldu.

Bir müşterinin bir ürün hakkındaki şikayetinin hemen altına bundan fırsat bilerek rakip firmanın reklamını yerleştirmesi ya da reklamını yapması çok sık rastlanan hareketler oldu. Örnek verecek olursak TTNet’in sorusuna Yandex’in cevabı gibi.

 

Bu örnekleri çoğaltmak mümkün. Bunun haricinde müşteri şikayetlerinin de tam zamanlı takip edilmesi ve bunlara da en uygun çözümün sunulması şu anda çok önemli ve mevcut CRM yazılımları bunu sağlamakta. Yani sizin Facebook, Twitter gibi sosyal medya araçlarını takip edip size anında raporlayan, hatta belirlediğiniz kelimelere göre analizler yapan yazılımlar artık CRM yazılımlarının içinde yerini aldı bile. 2015 yılı içerisinde bunların kullanımını ve bunların entegrasyonun sağlanması en çok gündeme gelen konular arasında yer alacak.

4.      Otomatik Öngörü

En ilginç konulardan biri de otomatik öngörü ile müşterinin elinde ürün bitmeden yenisini ona sunmak. Örnek vermek gerekirse yazıcınızın toneri bitmesine yakın yazıcınızın üretici ile irtibata geçip kendisi için uygun olan kartuşları sipariş etmesi verilebilir. Böylece siz işinize odaklanırken sistem kendi içinde hem bir satış fırsatı yakalamış hem de müşteri memnuniyetini sağlamış olacak. Bu aslında biraz da nesnelerin interneti kavramıyla da ilgili ve bu anlattığım senaryo şu anda HP tarafından yapılmakta sadece sisteme üye olmanız gerekmekte. Ben Londra’da yaşıyorum ve bu sistemin bir üyesiyim böylece kartuşum hiç bitmiyor.

Aynı şekilde siz sürekli aynı marketten alışveriş yapıyorsanız o market sizin sürekli aldığınız ürünleri bildiğinden size bitmeden yenisini gönderebilir ya da en azından bir mail ile size yenilerini isteyip istemediğinizi sorabilir.

Her ne kadar bu konunun şu anda aktif olarak kullanılsa da 2015 içerisinde daha farklı senaryo ve kullanımları ile karşımıza çıkacak ve genişleyecek bir konu.

5.      BigData (Büyük Veri)

Bu kadar çok veriyi tutmak tabii ki problem bir de bunu analiz etmeye kalkmak daha da büyük bir işkence haline dönüşebilir. İşte bu nedenle teknoloji dünyasında son dönemde bu sıkıntılardan ortaya çıkan BigData ve NoSQL gibi kavramlar çıkmış bulunmakta. Artık verileri daha hızlı ve daha performanslı analiz etmenizi ve analiz ettiğiniz veriyi daha akıcı ve anlaşılır görseller halinde sunan yazılımlar sistemlerin içerisine entegre edilmeye başlandı.

Mesela Microsoft Dynamics CRM içerisinde Online olarak hizmet veren Social Listening platformu sizin için sosyal medya araçlarından veriyi analiz ettikten sonra Microsoft PowerView ile çok akıcı ve anlaşılır interaktif görsel grafikler halinde size vermekte. İşte bu bağlamda CRM kavramı içerisinde önümüzdeki günlerde öne çıkacak ve firmaları üzerinde düşünmeye itecek konulardan bir tanesi de bigdata kavramı olacak.

2016 Yılı Öngörüsü

Gelişen teknolojiyi göz önünde bulundurarak 2016 Trendleri için de ufak bir öngörüde bulunmak sanıyorum faydalı olacaktır.

1.      Giyilebilir Teknolojiler

Teknoloji dünyasını yakından takip edenler akıllı saatlerle başlayan yeni bir akımın da farkındadırlar. O ada giyilebilir teknolojiler. Şu an etrafımızda akıllı saatler olarak gördüğümüz ama yakın bir gelecekte giysilerimiz ve ayakkabılarımız dahil olmak üzere üzerimizdeki bir çok nesnenin üzerine devreler girecek ve girmekte zaten. Google’ın GoogleGlass isimli gözlüğü de bunlara en güzel örneklerden. Google’a girip Nike+ Shoes yazdığınızda karşınıza cep telefonunuzla haberleşen bir sürü ayakkabı modeli gelecektir.

Peki, bu bize niye gerekli? Kullanıcılar bu yönde ürünler aldıkça bu yönde servis veren hizmetler de ortaya çıkmakta işte tam bu noktada müşteri memnuniyeti ve müşteri deneyimini ölçekleyebilmek adına CRM araçlarımızın da bu bilgileri alıp analiz edip sonuçlar üretmesi ve müşteri memnuniyetini sağlaması gerekme.

2.      Internet of Things (Nesnelerin İnterneti)

Bir önceki maddeye bakıp e biz giyilebilen birşeyler üreten bir firma değiliz ne yapalım demeyin. Nesnelerin interneti kavramı bu yüzden var. Kısaca tanımlamak gerekirse içinde başka bir cihazla (ki genellikle bu cihaz cep telefonu olmakta) iletişim kurabilen bir devre olan araç gereçler demek. Mesela kolunuza taktığınız bileklik.

Ya da bir pizza üreticisiyseniz pizza kutuları içine yerleştirilen bir devre olarak düşünebilirsiniz. Bir pizzacının pizzaları dağıtırken cep telefonu sayesinde pizzaları müşteriye bıraktığı andaki kutu içindeki sıcaklık ve nem bilgisini merkeze ilettiğini düşünün. Eğer belli bir bölgeden pizzaların tazeliği ya da kokusu hakkında şikâyet geliyorsa CRM uygulamamız içinde tuttuğumuz bu veriler sayesinde pizzanın o bölgeye uzak bir bayiden dağıtıldığını bu nedenle müşteriye vardığı anda soğudunu ve tazeliğini kaybettiğini şikâyetlerin bu nedenle arttığını analiz edebilirsiniz.

İşte CRM içerisinde her noktadan elde ettiğimiz verinin analizi ve müşteri memnuniyetini arttırmaya yönelik çalışmalarımıza etkisi bu yönde olacak bu kavramın.

Sonuç

Teknolojik gelişmeler devam ettikçe bizler kendimize müşteriyle iletişim kuracak yeni alanlar bulacak ve bunları hep bir fırsat olarak değerlendireceğiz. İşte bu fırsatları her zaman iyi değerlendiren bir adım önde olacak.

2015 yılı içerisinde CRM dünyasında konuşulacak gözde olacak adlarından söz ettirecek konulara ve teknolojik gelişmelere göz atmaya çalıştık. Umarım sizler için faydalı bir yazı olmuştur. 

Dynamics CRM 2015 Plug-in Mimarisi

Sizlere bugun Dynamics CRM icerisindeki Plug-in Mimarisinden soz etmek isitiyorum. Plug-in’ler IPlugin arayuzunden turetilmis kod parcaciklaridir ve CRM’in icerisinde belli bir sira icerisinde calisirlar. Kabaca tariff edersek bunlar birer .dll dosyalaridir ve CRM’e bu dosyaya ne zaman bakmasi gerektigini biz soyleriz. Plug-in’ler olay bazli olarak calisirlar. Yani herhangi bir kayit olusturuldugunda, guncellendiginde, silindiginde vb.. olaylar oldukca biz ilgili ayari yapmissak calisirlar.

Plug-in’lerin en güzel yani pre ve post olarak calismaya ayarlanabilmeleridir. Plug-in’ler olay bazli calisirlar demiştim iste bu olay olmadan önceki kaydin son hali üzerinden ve olay olduktan sonraki hali üzerinden işlem yapmaniza olanak sağlarlar.

Plug-in’lerin calismasi icin Microsoft.Xrm.Sdk.dll ve Microsoft.Crm.Sdk.Proxy.dll dosyalarinin referanslara eklenmis olmasi gerekmektedir. Tam yeri gelmisken bahsedeyim eger siz ucuncu parti bir .dll kullaniyorsaniz (yani kendi yazdiginiz siniflarin oldugu ya da diger uygulamalardan aldiginiz) bu .dll’lerin ilgili serverin assembly klasöründe olduğundan emin olun yoksa plug-in calismayabilir.

public class MyPlugin: IPlugin

{

    public void Execute(IServiceProvider serviceProvider)

    {}

}

 

Detaya inecek olursak IPlugin arayuzunden turerilmis bir sinif içerisinde Execute metodu yer almalidir. Bu metod parametre olarak IServiceProvider arayuzunden türetilmiş bir bilgi yiginini içerir. Yani CRM kod içerisinde yapacagimiz işlemlerde bize CRM içerisinde olan olaylardan bize bilgi tasir ki biz de bu bilgileri kodun içerisinde kullanalim. Ne gibi veriler içinde tasimakta derseniz cok fazla detay verebilirim mesela su anda hangi kullanicinin işlem yaptigi, tasidigi nesnenin turunu, eger pre-plugin ise değerlerin değişmeden önceki halini vb… bir cok veri içermekte.

Simdi sirasiyla gelen veri yiginlarini inceleyelim.

Plug-in Execution Context

Calisma zamaninda oluşan veriler bu yapi içerisinde yer almaktadır. Bunlara kodun calisma hiyerarşisi ve entity bilgileri de dahildir.

IPluginExecutionContext context = (IPluginExecutionContext)

    serviceProvider.GetService(typeof(IPluginExecutionContext));

Bir olay olduğunda kayit edilmiş bir plug-in’e bu veriler aktarılır aslinda o anda calisan butun plug-in’lere bu veriler aktarılır ama execution pipeline denen sralamaya uyarak aktarılır once pre sonra post pluginlere veri aktarılır. Hatta siz pre-plugin ile bir veriyi değiştirirseniz post-plugin’e o veri aktarılır.

Tabii burada yeri gelmişken bahsedeyim burada sozu edilen kodlarin sonsuz döngüye girmemeleri için sistem içerisinde Depth denen bir anahtar yer almaktadır. Varsayilanda bu bir plugin’i arda arda 8 kere calistirir ve durdurur. Boylece sistemin bir kod yanlisigi ile çökmesi engellenmiştir. Bu değer değiştirebilir bir değerdir.

Sistemin calismasi da aslinda su mantiga dayanmakta;



Yani Event Execution Pipeline’a bir mesaj girdiginde Pre-Event -> Platform Islemleri (Yani CRM’in kendi ic isleyisi) -> Post-Event seklinde islenmekte. Bu dongu senkron ve asenkron yapilar için böyle ilerlemekte.

Organization Servise Erisme

CRM içerisinde işlem yapabilmek her zaman bir servis nesnesine ihtiyaç duymaktayız. Iste kullanicinin hareketi neticesinde acilmiş bu servisi bize kullanmamiz için geçirmekte serviceProvider nesnesi.

IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

Notification Servise Erisme

Senkron olarak işaretlenmiş plug-in’ler Microsoft Azure Service Bus’a veri mesaj gondebilirler. IServiceEndpointNotificationService turunden olan bu bilgi Azure Service Bus’a gönderilir. Bu sayede Azure Service Bus içerisinde endpoint oluşturulmuş ve endpoint’i dinleyen 3. Parti bir servis ile iletişime geçebilmektedir.

Input ve Output Parametreleri

InputParameters nesnesi su anda yapilan hareketin yani su anda tetiklenmiş olayin bilgisini ve su anda üzerinde işlem görülen entity’nin bilgisini içerir. Bu bilgiye erişmek için “Target” nesnesine bakmamiz gerekmektedir ve bu nesneyi alip Entity class’ina çevirebiliriz. Input nesneleri Request message yapisindadir.

if (context.InputParameters.Contains("Target") &&

    context.InputParameters["Target"] is Entity)

{

    // Obtain the target entity from the input parameters.

    Entity entity = (Entity)context.InputParameters["Target"];

}

Fakat unutmaniz gereken bir nokta var her mesaj Entity nesnesini içermeyebilir. Ornegin DeleteRequest; Entity değil EntityReference dondurur.

if (context.InputParameters.Contains("Target") &&    context.InputParameters["Target"] is EntityReference)

{

    // Obtain the target entity from the input parameters.

    EntityReference entity = (EntityReference)context.InputParameters["Target"];

}

Benzer sekilde OutputParameters da Response message içerir. Ama sunu unutmayin ki senkron post-event ve asenkron plug-in’ler OutputParameters turunden nesneler içerirler.

Pre ve Post Entity Imajlari

Bu konuyu okurken sakin Ingilizce Images kelimesinin resim anlamiyla karistirmayin buradaki anlami verinin  o anki goruntusu seklinde ifade etmek daha doğru olur. Aslinda tam Ingilizce tabiriyle snapshot. PreEntityImages ve PostEntityImages verileri sistem tarafından size gönderilir ama siz ozellikle beklediğiniz alanlari plug-in’in kayit işlemi sirasinda sisteme soyleyebilrsiniz.

Burada tabii ki bir mantik çerçevesi olduğunu da unutmayin Create aninda bir nesnenin preImage’i olamayacagi gibi Delete işleminden sonra da bir postImage beklemeyin.

Simdi bu bilgileri verdikten sonra butun bunlari birleştirerek bir plug-in temel goruntusune bakalim.

Aciklamalar kodun içinde.

using System;

using System.ServiceModel;

using Microsoft.Xrm.Sdk;

 

public class MyPlugin: IPlugin

{

    public void Execute(IServiceProvider serviceProvider)

    {

        // Sandbox içerisinde calisan plug-in’ler TracingService’den yararlanabilirler.

        ITracingService tracingService =

            (ITracingService)serviceProvider.GetService(typeof(ITracingService));

 

        //Context’i elde ediyoruz.

        IPluginExecutionContext context = (IPluginExecutionContext)

            serviceProvider.GetService(typeof(IPluginExecutionContext));

 

        // InputParameters’dan gelen verileri aliyoruz

        if (context.InputParameters.Contains("Target") &&

            context.InputParameters["Target"] is Entity)

        {

            // Target ile entity’e erisiyoruz.

            Entity entity = (Entity)context.InputParameters["Target"];

 

            // Beklediginiz entity geldi mi diye kontrol ediyoruz.

            if (entity.LogicalName != "account")

                return;

 

            // CRM Servisi elde ediyoruz

            IOrganizationServiceFactory serviceFactory =

                (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));

            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

 

            try

            {

                / Iste buradan sonrasi size kalmis istediğiniz kodu yazabilirsiniz.

            }

 

            catch (FaultException<OrganizationServiceFault> ex)

            {

                throw new InvalidPluginExecutionException("An error occurred in MyPlug-in.", ex);

            }

 

            catch (Exception ex)

            {

                tracingService.Trace("MyPlugin: {0}", ex.ToString());

                throw;

            }

        }

    }

}

Plug-in’ler Icerisindeki Hatalari Yakalamak

Bu makalede plug-in hata yakalama mekanizmasina deginecegim. Senkron calisan plug-in’ler sandbox’da olsun ya da olmasin herhangi bir hata ile karsilastiklarinda geriye kullaniciya uyari gösterecek bir yapiya sahiptirler ve bu durumu Dynamics CRM yönetir. Yani siz sadece hatayi geriye dondurursunuz.

Asenkron calisan yapilar için CRM içerisinde System Job(AsyncOperation) isimli bir bolum yer almaktadır. Iste asenkron hatalari da buradan takip edebilirsiniz.

Senkron calisan plug-in’lerde ise hata mesajlarini InvalidPluginException turunden bir hata göndererek kontrol edebilirsiniz. Message ozelligine herhangi bir değer gönderirseniz sistem onu gösterir aksi takdirde varsayilan hata mesaji görüntülenir.

Ayrica sunu da belirteyim Sandbox içinde calismayan plug-in’ler için hata mesajlari sistemin calistigi serverdaki Olay Goruntuleyici içerisinde Uygulama hatalari bolumu içerisine de kaydedilir.

Plug-in içerisinde uygun gordugunuz yerde su sekilde hata fırlatabilirsiniz:

throw new InvalidPluginExecutionException("The account number can only be set by the system.");

Bir plug-in hata firlattiginda CRM su sekilde bir uyari vermektedir.



Log dosyasini incelediğimizde de detaylari almaktayız. Bizim gönderdiğimiz mesaja dikkat edin lütfen;

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=7.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: The account number can only be set by the system.

Detail: <OrganizationServiceFault xmlns="http://schemas.microsoft.com/xrm/2011/Contracts" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">

  <ErrorCode>-2147220970</ErrorCode>

  <ErrorDetails xmlns:a="http://schemas.datacontract.org/2004/07/System.Collections.Generic">

    <KeyValuePairOfstringanyType>

      <a:key>CallStack</a:key>

      <a:value i:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">

        at Microsoft.Crm.Sdk.Samples.AccountNumberPlugin.Execute(IServiceProvider serviceProvider)

        at PluginProfiler.Library.PluginAppDomainProxy.ExecuteCore(Stopwatch watch, ProfilerExecutionReport report, Object instance, Object executionParameter)

        at PluginProfiler.Library.AppDomainProxy.Execute(ProfilerExecutionConfiguration configuration, ProfilerExecutionReport report)

      </a:value>

    </KeyValuePairOfstringanyType>

  </ErrorDetails>

  <Message>The account number can only be set by the system.</Message>

  <Timestamp>2015-04-08T15:29:50.7437667Z</Timestamp>

  <InnerFault i:nil="true" />

  <TraceText i:nil="true" />

</OrganizationServiceFault>

Ama siz temel bir hata yönetim sinifina sahip olmak ve yazdiginiz butun kodlarda kullanmak isterseniz su sekilde bir Exception mimarisini yazdiginiz kodda kullanabilirsiniz. Fakat burada unutmamaniz gereken nokta siz hata fırlatmaz hatalari kendiniz Handle ederseniz CRM kullaniciya hata mesaji göndermeyecektir. Bunun için InvalidPluginException’i siz firlatmalisiniz.

Asagidaki kodu Plug-in’ler içerisinde kullanmanizi pek tavsiye etmem cunku sistem gayet detayli bir geri bildirim yapmakta ama bir hata aliyor ve isin içinden cikamiyorsaniz bu kodu denemenizde fayda olabilir. Hatayi serverda ya da CRM içinde bir yerlere yazdırıp incelebilrisiniz. Yine uygun gordugunuz bir yerde kullaniciya hata göstermek istiyorsaniz “InvalidPluginExecutionException” firlatmayi unutmayin.

catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> ex)

                    {

                        Console.WriteLine("The application terminated with an error.");

                        Console.WriteLine("Timestamp: {0}", ex.Detail.Timestamp);

                        Console.WriteLine("Code: {0}", ex.Detail.ErrorCode);

                        Console.WriteLine("Message: {0}", ex.Detail.Message);

                        Console.WriteLine("Inner Fault: {0}",

                            null == ex.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");

                    }

                    catch (System.TimeoutException ex)

                    {

                        Console.WriteLine("The application terminated with an error.");

                        Console.WriteLine("Message: {0}", ex.Message);

                        Console.WriteLine("Stack Trace: {0}", ex.StackTrace);

                        Console.WriteLine("Inner Fault: {0}",

                            null == ex.InnerException.Message ? "No Inner Fault" : ex.InnerException.Message);

                    }

                    catch (System.Exception ex)

                    {

                        Console.WriteLine("The application terminated with an error.");

                        Console.WriteLine(ex.Message);

 

                        // Display the details of the inner exception.

                        if (ex.InnerException != null)

                        {

                            Console.WriteLine(ex.InnerException.Message);

 

                            FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault> fe = ex.InnerException

                                as FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>;

                            if (fe != null)

                            {

                                Console.WriteLine("Timestamp: {0}", fe.Detail.Timestamp);

                                Console.WriteLine("Code: {0}", fe.Detail.ErrorCode);

                                Console.WriteLine("Message: {0}", fe.Detail.Message);

                                Console.WriteLine("Trace: {0}", fe.Detail.TraceText);

                                Console.WriteLine("Inner Fault: {0}",

                                    null == fe.Detail.InnerFault ? "No Inner Fault" : "Has Inner Fault");

                            }

                        }

                    }

 

Execute Metodu

Dynamics CRM plug-in mimarisi isimli makalede InputParameters ve Output Parameters konularindan bahsederken Request ve Response konularina değinmeden geçtim konu havada kalmasin diye ayri bir baslik altinda incelemenin daha doğru olacagini duşundum. (Ilgili makaleye buradan ulasabilirsiniz)

CRM Servisi içerisindeki Execute Metodu Request ve Response yani Talep ve Yanit seklinde calismaktadir. Sistem üzerinde yapacaginiz butun hareketleri bu sekilde yaopabilirsiniz ki buna ayri metodlari bulunan Create, Update, Delete bile dahildir.

Konu aslinda basit olduğundan çokça açıklanacak bir tarafi da yok gibi ama calisma yapisina bakacak olursak siz bir talepte bulunursunuz o da size yanit verir diye kisaca özetleyebiliriz.



Execute metodunun alabileceği Request’lere makalenin sonunda yer vereceğim. Ama oncelikle sunu da belirteyim ki Request nesnesi opsiyonel parametrelere de sahiptir. Bu parametreler sunlardir.


Parameter

Description

Messages

SolutionUniqueName

Islemin yapilacagi Cozumun Adi

AddPrivilegesRoleRequest

CreateRequest

DeleteRequest

MakeAvailableToOrganizationTemplateRequest

UpdateRequest

SuppressDuplicateDetection

Eslenen kayitlar bulunsun mu bulunmasin mi

CreateRequest

UpdateRequest

 

Kullanima dair ornek kod ise su sekilde;

Account target = new Account();

target.Name = "Fabrikam";

CreateRequest req = new CreateRequest();

req.Target = target;

req["SuppressDuplicateDetection"] = true;

req["SolutionUniqueName"] = "MySolutionName";

CreateResponse response = (CreateResponse)_service.Execute(req);


Eger isterseniz Execute Metodunu asenkron olarka da calistirabilirsiniz. Bu ekranda donmalari ve kullanicilarin ekrandan işlem bitmeden cikmalarini önleyecektir. Bunun için yapmaniz gereken ExecuteAsyncRequest mesajini geçmek olacaktır.

ExecuteMultipleRequest ile de toplu daha aktarimlarinda kullanabileceğiniz mesajdir.

xRM Mesajlarinin tamamina bu adresten ulaşabilirsiniz : https://msdn.microsoft.com/en-us/library/gg334698.aspx

CRM mesajlarina da bu adresten ulaşabilirsiniz : https://msdn.microsoft.com/en-us/library/gg309482.aspx

Dynamics CRM'e saatinizden erisin :)

Akilli saatler de akilli telefonlar kadar hizli bir sekilde hayatimiza girdi. Su anda sektördeki buyuk firmalar ve hatta kickstarter grisimleri bile akilli saat projeleriyle karsimiza cikmakta. Ben de bir Pebble kullanicisiyim ve ozellikle 1 hafta dayanan pili ile diğer akilli saatlerden ayrilmakta.

Bugun Dynamics CRM ile akilli saatlerin nasil birleştirileceğini inceleyeceğiz. Akilli saatler genel itibariyle telefon üzerindeki notificationlari gösterebilme yeteneğine sahipler. Telefon üzerinde notification oluşturmak için ben bugun Pushover sistemini kullanacagim.

Soyle bir senaryomuz olsun; sistem üzerinde oluşturduğumuz bir is akisi ile CRM uzerinde servis talepleri oluştuğu anda push notification isimli bir entity üzerinde bir kayit oluşturuyoruz. Bu kayit varsayilanda gönderilmeyi bekliyor durumunda olacak. Uygulamamiz bu kayitlari okuyacak ve Push Notification’in servisine gönderecek. Boylece notification telefonumuza orada da saatimize gelecek.

Sizin oluşturduğunuz sistemlerde farkli is akislari ile yine push notification isimli entity’e kayit oluşturabilir böylece degisik senaryolar içinde bu sistemi kullanabilirsiniz. Ornegin sistem üzerinde değeri 50.000 tl üzerinde bir firsat oluşturulduğunda bu sistemi tetikleyebilirsiniz.

Sisteme uye olmak için telefonunuza Pushover uygulamasini indirmeniz gerekmekte. Daha sonrasinda ise https://pushover.net sitesinden kendinize bir hesap oluşturuyorsunuz.

Bu sistem üzerinden notification gönderebilmek için 2 bilgiye ihtiyamiz bulunmakta

1.       Sizin User Key’iniz. Her bir kullanicinin bir key’i var sistemde.



2.       Create New Application linkine tıklayarak olusturacaginiz Application Key’i.



Bu sekilde elde ettiğimiz key’ler ile sistem üzerinden notification gönderebilir hale geldik. Bu bilgilerin CRM’de saklanacagi en uygun yer bence Kullanici Kartiydi ve bende bu nedenle kullanici nesnesi üzerine PushOverToken ve PushOverUserKey isimli iki alan actim ve bilgileri buraya girdim.



Daha sonra Push Notification isimli aktivite turunde bir entity oluşturdum ve asagidaki alanlari actim. Buradaki önemli nokta böyle bir entity’i nasil kullanacagimiz. Yazinin basinda da belirttiğim gibi cok farkli senaryolar için bu nesne üzerinde kayitlar oluşturabilirsiniz.


Olusturdugum alanlari incelersek;

Subject : Ekran görüntülenecek baslik bilgisi

To : Mesajlarin kimlere gönderileceği bilgisi

Regarding : Kaydin bagli bulunduğu ana entity. Burada bu bilgiyi telefon üzerinden kullanici bu kayda ulaşmak isterse tek tiklama ile bu bilgiye ulassin diye tutuyorum.

Status Reason : Varsayilanda “Waiting To Send” yani bekliyor konumunda oluşturuluyor kayitlar. Gondeme işlemi tamamlandiktan sonra bu alani “Sent” yani gönderildi olarak değiştiriyorum.

Description : Detayli bilgi vermek için bu alani kullaniyorum.

 

static string URL = "https://xxx.contoso.com";

        private static IOrganizationService ServiseBaglan()

        {

            try

            {

                Uri organizationUri = new Uri(String.Format("{0}/XRMServices/2011/Organization.svc", URL));

                ClientCredentials clientcred = new ClientCredentials();

                clientcred.UserName.UserName = "kullanici adi";

                clientcred.UserName.Password = "sifre";

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

                IOrganizationService _service = (IOrganizationService)_serviceproxy;

                return _service; ;

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);

                return null;

            }

        }

 

        private static void changeStatus(IOrganizationService service, Guid Id)

        {

            // Create the Request Object

            SetStateRequest state = new SetStateRequest();

 

            // Set the Request Object's Properties

            state.State = new OptionSetValue(0);

            state.Status = new OptionSetValue(100000000);

 

            // Point the Request to the case whose state is being changed

            state.EntityMoniker = new EntityReference("new_pushnotification", Id);

 

            // Execute the Request

            SetStateResponse stateSet = (SetStateResponse)service.Execute(state);

        }

        static void Main(string[] args)

        {

            try

            {

                string fetchXml = @"<fetch mapping='logical'>

                                 <entity name='new_pushnotification'>

                                    <attribute name='activityid' />

                                    <attribute name='subject' />

                                    <attribute name='description' /> 

                                     <filter type='and'>

                                        <condition attribute='statuscode' operator='eq' value='1'/>

                                     </filter>

                                    <link-entity name='activityparty' from='activityid' to='activityid' alias='ac'>

                                        <link-entity name='systemuser' from='systemuserid' to='partyid' alias='ad'>

                                            <attribute name='new_pushovertoken' />

                                            <attribute name='new_pushoveruserkey' />

                                        </link-entity>

                                    </link-entity>

                                 </entity>

                             </fetch>";

 

                IOrganizationService service = ServiseBaglan();

               

                if (service != null)

                {

                    Console.WriteLine("Servise Baglanildi");

 

                    EntityCollection entCollection = (EntityCollection)service.RetrieveMultiple(new FetchExpression(fetchXml));

                    foreach (var item in entCollection.Entities)

                    {

                        Console.WriteLine("Aktarilacak kayitlar bulundu");

 

                        if (item.Contains("ad.new_pushovertoken") && item.Contains("ad.new_pushoveruserkey") && item.Contains("subject") && item.Contains("description"))

                        {

                            string PushOverToken = ((AliasedValue)item["ad.new_pushovertoken"]).Value.ToString();

                            string PushOverUserKey = ((AliasedValue)item["ad.new_pushoveruserkey"]).Value.ToString();

                            string subject = item["subject"].ToString();

                            string description = item["description"].ToString();

                            Guid activityid = new Guid(item["activityid"].ToString());

                            string url = String.Format("{0}/main.aspx?etn=new_pushnotification&pagetype=entityrecord&id=%7B{1}%7D", URL, activityid.ToString());

 

                            dynamic Parameters = new NameValueCollection() {

                        {

                            "token",

                            PushOverToken

                        },

                        {

                            "user",

                            PushOverUserKey

                        },

                        {

                            "message",

                            description

                        },

                        {

                            "url",

                            url

                        },

                        {

                            "url_title",

                            "Open Record"

                        },

                        {

                            "title",

                            subject

                        }

                        };

 

                            WebClient client = new WebClient();

                            Console.WriteLine("Kayitlar gonderiliyor");

                            client.UploadValues("https://api.pushover.net/1/messages.json", Parameters);

                            Console.WriteLine("CRM guncelleniyor");

                            changeStatus(service, activityid);

                        }

                    }

                }

 

                Console.WriteLine("Tamamlandi");

                Console.ReadLine();

}

            catch (Exception ex)

            {

                Console.WriteLine(ex.Message);

                return null;

            }

        }

 

Kodda da görebileceğiniz uzere Ilk olarak CRM Servisine baglaniyoruz. Ben IFD enabled bir organizasyon kullandigim için benim servis baglantim bu sekilde Office 365 ya da on premise sistemlerde farkli sekillerde CRM servise bağlanma yöntemleri mevcut. Bu konuda sorun yasarsaniz benimle iletişime geçebilirsiniz.

 

Daha sonra ise fetchXML sorgumuz ile sistem üzerinde bekleyen notification’larin bilgisini aliyoruz ama bu işlemi yaparken ayni zamanda systemuser nesnesine de dallanarak ihtiyacim olan pushovertoken ve pushoveruserkey bilgilerini de aliyorum. Boylece her bir kullanici için teker teker veri sorgulayarak servisi meşgul etmiyorum.

 

@"<fetch mapping='logical'>

                                 <entity name='new_pushnotification'>

                                    <attribute name='activityid' />

                                    <attribute name='subject' />

                                    <attribute name='description' /> 

                                     <filter type='and'>

                                        <condition attribute='statuscode' operator='eq' value='1'/>

                                     </filter>

                                    <link-entity name='activityparty' from='activityid' to='activityid' alias='ac'>

                                        <link-entity name='systemuser' from='systemuserid' to='partyid' alias='ad'>

                                            <attribute name='new_pushovertoken' />

                                            <attribute name='new_pushoveruserkey' />

                                        </link-entity>

                                    </link-entity>

                                 </entity>

                             </fetch>";

 

 

Verileri aldiktan sonra ise bunlari istediğim gibi düzenleyip string veriler haline getiriyorum. Sonunda ise asagidaki bolum ile servise Push Notification servisine gönderiyorum;

 

                            dynamic Parameters = new NameValueCollection() {

                        {

                            "token",

                            PushOverToken

                        },

                        {

                            "user",

                            PushOverUserKey

                        },

                        {

                            "message",

                            description

                        },

                        {

                            "url",

                            url

                        },

                        {

                            "url_title",

                            "Open Record"

                        },

                        {

                            "title",

                            subject

                        }

                        };

 

                            WebClient client = new WebClient();

                            Console.WriteLine("Kayitlar gonderiliyor");

                            client.UploadValues("https://api.pushover.net/1/messages.json", Parameters);

                            Console.WriteLine("CRM guncelleniyor");

                            changeStatus(service, activityid);

 

 

Burada dikkat edilmesi gerekn nokta URL kisminda gerçekten sistemdeki nesnenin acilacagi URL’i buraya getiriyorum ki telefondan kullanici direkt kayda ulassin.

Gonderme işleminden sonra ise kayitlari gönderildi diye güncelliyorum ki tekrar tekrar ayni kayitlari göndermeyelim.

 

Sonuc olarak once telefonda sonra ise saatimde gelen verilere ulaşıyorum :)

PushOver'in ana ekraninda gelen notification.




Notification'i acinca detaylara ulasiyorum. 



Open Record isimli linke tiklayinca da direkt ilgili kayda ulasiyorum.



Ve sonuc Pebble ekraninda CRM'den gelen Notification'i goruyorum :) iste mutlu son...

CRM Tablet Uygulamasini Calistirmak

a) Dynamics CRM’I kurdurktan sonra ilgili icon’a basip calistiriyoruz.

 

1.     Let's get set up! ekranindaki kutucuga Dynamics CRM’e girerken kullandiginiz adresi yazmaniz gerekmekte.

 

2.     Sag alt kosedeki ok seklindeki dugmeye tiklanizda siradaki ekran gelecektir.

b)    Kullanici adi ve sifre bilgilerinizi bu ekrana girdikten sonra “Sign In – Oturum Ac” dugmesine basiniz.

1.     Kullanici Adi

2.     Sifre.

3.     Oturumun surekli acik tutulmasi icin isaretleyiniz

4.     Sign in – Oturum Ac dugmesine basiniz.

c)     c) Bu bolumleri gectikten sonra asagidaki ekran gelecek. Bu ekranda baglanti hiziniza bagli olarak bir sure kalabilirsiniz.

d)      d) Iste bu ekrandan sonra Dynamics CRM tablet versiyonu acilacak ve kullanima hazir olacaktir.

Dynamics CRM Tablet Uygulama Magazalari

Dynamics CRM Tablet uygulamasini kurmak icin elimizdeki cihaz ya da cihazlarin uygulama magazalarina gitmemiz gerekmekte.

Windows 8 : http://apps.microsoft.com/windows/en-us/app/93772212-7b72-4aee-bc4e-b1adb7712ebe



Windows 8.1 : http://apps.microsoft.com/windows/en-us/app/dec52fd4-dbc0-41b1-9cdd-cdc070051918



iPad : https://itunes.apple.com/us/app/microsoft-dynamics-crm/id678800460?mt=8


Android Tablet : https://play.google.com/store/apps/details?id=com.microsoft.crm.crmtablet

Dynamics CRM IFD (Windows server 2012 R2 ADFS 3.0) ile CRM for Outlook Baglanma Problemi

Eger sizde benim gibi Dynamics CRM kurulumunuz ile ADFS 3.0'i ayni server uzerinde kullaniyorsaniz Outlook Client Configuration Wizard ile yapilandirma sirasinda authentication probleminden dolayi bir hata alabilirsiniz.
Log dosyasini incelediginizde asagidaki gib bir hata mesaji olacaktir.

"Error connecting to URL: https://org.contoso.com/XRMServices/2011/Discovery.svc Exception: Microsoft.Crm.CrmException: Authentication failed"

Bu hata ile ilgili nette buldugun bircok cozeum yolunu denesem de sonuc vermedi. Bende Fiddler ile arka tarafatki iletisimde neler oldugunu izlemeye karar verdim. Fiddler ile gordum ki Configuration Wizard'in gitmeye calistigi bir adreste 503 hatasi almaktayim, Adres ise su formattaydi: 

"https://adfs.contoso.com/adfs/services/trust/mex"

Evet sorun ADFS'deydi. CRM web arabiriminde sorunsuzca gorevini yerine getiren ADFS Outlook Client'da ise hataya neden olmaktaydi. Bunun uzerine hemen ADFS Servera gittim ve arastirmalara basladim.
ADFS Serverda Event Viewer'da  sorunun kaynagini yakaladim:

Event ID:      102
Description:
There was an error in enabling endpoints of Federation Service. Fix configuration errors using PowerShell cmdlets and restart the Federation Service. 
 
Additional Data 
Exception details: 
System.ServiceModel.AddressAlreadyInUseException: There is already a listener on IP endpoint 0.0.0.0:808. This could happen if there is another application already listening on this endpoint or if you have multiple service endpoints in your service host with the same IP endpoint but with incompatible binding configurations. ---> System.Net.Sockets.SocketException: Only one usage of each socket address (protocol/network address/port) is normally permitted
 

Yani ADFS Server 808 nolu bir portu kullanmaktaydi. 808 Portu ayni zamanda Asynchronous Service tarafinda da kullanilmakta.
ProtocolPortDescriptionExplanation

TCP

808

CRM server role communication

The Asynchronous Service and Web Application Server services communicate to the Sandbox Processing Service through this channel. The default port is 808, but can be changed in the Windows registry by adding the DWORD registry value TcpPort in the key HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSCRM\.

Yeri gelmisken bahsedeyim CRM tarafindan kullanilan diger portalarin listesi de soyle:
ProtocolPortDescriptionExplanation

TCP

80

HTTP

Default web application port. This port may be different as it can be changed during Microsoft Dynamics CRM Server Setup. For new websites, the default port number is 5555.

TCP

135

MSRPC

RPC endpoint resolution.

TCP

139

NETBIOS-SSN

NETBIOS session service.

TCP

443

HTTPS

Default secure HTTP port. The port number may differ from the default port. This secure network transport must be manually configured. Although this port is not required to run Microsoft Dynamics CRM, we strongly recommend it. For information about how to configure HTTPS for CRM, see “Make Microsoft Dynamics CRM client-to-server network communications more secure” in Post-installation and configuration guidelines for Microsoft Dynamics CRM in the Installing Guide.

TCP

445

Microsoft-DS

Active Directory service required for Active Directory access and authentication.

UDP

123

NTP

Network Time Protocol.

UDP

137

NETBIOS-NS

NETBIOS name service.

UDP

138

NETBIOS-dgm

NETBIOS datagram service.

UDP

445

Microsoft-DS

Active Directory service required for Active Directory access and authentication.

UDP

1025

Blackjack

DCOM, used as an RPC listener.

Listenin tamamina bu adresten ulasabilirsiniz. https://technet.microsoft.com/en-us/library/hh699823.aspx

Sorunumuza geri donersek 808 nolu portu degistirmem gerekiyordu. Iste asagidaki komut da tam bu ise yariyor:
Set-ADFSProperties –nettcpport 809

ADFS portunu 809 olarak degistirdim ve servisi yeniden baslattim. 
Configuration Wizard'a geri dondum ve tekrar denedim sorun cozulmustu. Zaten Fiddler'da da ilgili bolumu sorunsuzca gectigini gordum. 

Umarim sizlere de faydali olur.

*************************
21/05/2015 tarihinde ek:
Yukaridaki durum update rollup 0.1 yukledikten sonra yine devam etti. Konuyu arastirinca bu sefer de 49443 portunda ayni sorunun oldugunu gordum. Konuyu inceleyince bu portu da ADFS TlsClientPort oldugunu ogrendim.
Bu portu da yukaridaki konutla baska bir porta yonlendirdim.
Set-ADFSProperties -tlsclientport 42223

firewall ve diger ayarlari yaptiktan sonra ADFS Servisi yeniden baslattim ve hersey yoluna girdi.