Microsoft’un Çöpe Giden Yazılım Teknolojileri

25 Ara
  • Silverlight
  • WCF
  • WPF
  • Windows Forms
  • Web Forms

Microsoft teknolojilerinde son yıllarda önemli gelişmeler yaşanıyor. Takip etmekte zorlandığımız bu değişiklikler şüphesiz olması gereken şeylerdir. Yukarıda listelediğim teknolojiler, Microsoft’un  bir dönem parlayan yıldızlarıydı. Geçen zaman içinde yazılım dünyasında yaşanan evrim sonucu , Microsoft tarafında bir takım sorunlara çözüm bulmak ve bazı teknolojilerle rekabeti yakalayabilmek adına bir takım gelişmelere neden oldu. Yazılım dünyasındaki her yeni gelişme, karşımıza yeni bir ürün olarak çıktı. Gelişme ilerledikçe evrim, bir takım organların sonunu getirdi. Şunu da belirtmeliyim ki bu yazı Microsoft teknolojilerine karşı durmak için değil, bazı teknolojilerin zamanla yerini başka teknolojilere bıraktığını anlatmak amacıyla kaleme alınmıştır. Serbest pazar ortamında her firma ürününü ortaya koyar ve herkes istediği teknolojiyi dilediğince seçmekte özgürdür.

Silverlight

Adobe Flash, Java Flex v.b gibi client taraflı uygulamalara alternatif olarak üretilen zengin içerik ürünü Silverlight, mobil internet tarayıcılar tarafında yetersiz kalınca ve geliştiricilerin Javascript gibi tüm tarayıcılarda çalışabilen bir teknolojiyi tercih etmesiyle fişi çekilen teknolojilerden biri oldu. Ülkemizde ve diğer ülkelerde Silverlight düşkünü yazılımcılar için adeta bir hayal kırıklığı oldu. Çünkü bu gelişme birçok yatırımın güncelliğini yitirip zamanla çöpe gitmesi demekti.

WCF

Servis odaklı altyapı sistemleri için geliştirilen WCF teknolojisi SOAP ve RESTful servisler oluşturmak için bir altyapı sunmaktadır. HTTP tabanlı REST servislarinin yaygınlaşmasıyla ivme kaybeden ve durma noktasına gelen hatta bitti denilebilecek teknolojilerden birisi. WCF teknolojisi SOAP servisleri oluşturmak için ideal bir seçimdir. Ancak RESTful servisler oluşturma konusunda liderliğini WEB API teknolojisine kaptırmıştır. (Güncelleme: WCF servislerinin REST ve SOAP ayrımına vurgu yapıldı. 21.02.2015)

Windows Forms

Masaüstü programlama araçlarından Windows Forms teknolojisi ise WPF teknolojisinin gelmesiyle silikleşen teknolojiler arasında. WPF teknolojisini Windows Forms teknolojisine göre makul kılan özelliklerin başında View tarafı ile Model tarafının birbirinden ayrılmasını sağlamasıydı. Windows Froms, kod arayüzü ve grafik arayüzü ile çalışmaktadır. WPF ise kod arayüzü, grafik arayüzü ve grafik arayüzünü şekillendirebilen XAML arayüzü ile ortaya çıkmıştır. Bu durumda MVVM (Model-View-ViewModel) yazılım desenlerinin uygulanması kolaylaşmakta ve daha kolay yönetilebilir uygulamalar geliştirilebilmektedir.

WPF

Windows 8 ile birlikte bizi işletim sistemi düzeyinde şaşırtan Microsoft, XAML teknolojisini .Net framework tarafından işletim sistemi üzerine alarak bizi tekrar şaşırttı. Bu da demek oluyor ki artık masaüstünde artık WinRT teknolojisi yer alacak. Bu durumda WPF teknolojisi de yıkılmak üzere demektir.

Web Forms

Microsoft’un Web geliştirme tarafında sihirli çubuğu olan Web Forms teknolojisi de MVC uygulama mimarisine yenik düştmüştür diyebiliriz. Web Forms ile oluşturulmuş birçok popüler web sitesi bu günlerde MVC teknolojisine geçiş yapmaya başladı bile. Web Forms teknolojisinin hakkını yememek lazım ki çok sayıda popüler uygulamaya temel oluşturmuştur. Ancak MVC teknolojisinin iş birimlerinin birbirinden ayrılmasını sağlayan mimarisi ve bu sayede geliştirici hakimiyetini ön plana çıkarması ayrıca birim test yazmaya olanak  sağlaması zamanla onu popüler hale getirmiştir. Şahsen ben Web uygulamalarına direk MVC tarafından başlayanlardanım. (Güncelleme: 21.02.2015)

Microsoft gelişime, yeniliğe önem veren bir şirket. Ancak insanların yıllarca üzerinde çalışıp yatırım yaptığı teknolojilerin birden yok olması geliştiricileri ve şirket yöneticilerini sıkıntıya sokabiliyor. Bu durumda şu soru akıllara geliyor. Bu teknoloji de son bulursa ne yapacağız? Gelişim oldukça bir şeylerin sonu gelecek elbette.

Çöpe giden teknolojiler sadece Microsoft tarafıyla sınırlı değildir. Open source tarafında da çok fazla proje çöpe gitmiştir. Örneğin java tarafında da MVC yaygınlaşınca Serve taraflı bileşen teknolojiler pek tercih edilmez hale gelmiştir.

Bu durumda öngörülü olmak önem arz etmektedir. Spesifik teknolojiler yerine platform bağımsız teknolojilere eğilim göstermek her zaman faydalı olacaktır. Hangi programlama dili olursa olsun, yapılan iş genele hitap edecek şekilde tasarlanmalıdır. Bu sayede genişletilebilirlik(extensibility) ilkesi ile hareket etmiş oluruz ve hiç bir teknolojiye sıkı sıkıya bağımlı kalmayız.

Proje – İKABİS (İçmesuyu Kananizasyon ve Altyapı Bilgi Sistemi)

13 Kas

Kocaeli Büyükşehir Belediyesi İSU Genel Müdürlüğünde hazırlanan İKABİS (v.1.0) projesi İSU bünyesinde yayına açılmıştır.

Projenin amacı, imalatı tamamlanan altyapıların Coğrafi Bilgi Sistemi(CBS) standartlarına getirilmiş sayısal bilgilerinin WEB ortamından yayına sunulmasıdır.

Yayına açılan altyapı bilgileri, koordinatlı uydu fotoğrafı üzerinde görüntülenebilmektedir. Bu sayede hangi altyapı bilgisinin nerede olduğu kolayca bulunabilmektedir.

Yayına açılan altyapı bilgileri şu şeklidedir.

  • İçmesuyu hatları
  • Kanalizasyon hatları
  • Yağmursuyu hatları
  • Su depoları
  • Arıtma tesisleri
  • Terfi merkezleri
  • Abone noktaları
  • Dere Islahları
  • Vanalar
  • Yangın muslukları
  • Diğer donatı bilgileri

Ben bu projenin veritabanı standartlarının geliştirilmesi ve WEB yazılımının hazırlanmasından sorumluydum. Harita mühendisi arkadaşlarım Azize KOÇ, Yusuf Ziya DEMİRCİ ve Abdullah Talha DERİCİ de harita verilerinin hazrılanması, altyapıların sayısallaştırılması, CBS’ye hazır halegetirilmesi ve ArcGIS server’da yayına açılması sürecinde  görev almışlardır. 6 ay gibi bir sürenin sonunda projeyi başrıyla hayata geçirmiş bulunuyoruz.

Projeyle ilgili bazı ekran görüntüleri şu şeklidedir.

İKABİS – Altyapı görüntüsü
İKABİS – Depo sorgu görüntüsü

Projenin altyapısın oluşturan teknolojiler ise şu şeklide:

  • CAD Programları (Altyapıların çizimi)
  • ArcGIS (CAD verilerinin CBS formatına dönüştürülmesi)
  • ArcGIS Server (Map service yayını)
  • Oracle database (ArcSDE)
  • Esri Silverlight API (Web Yazılımı)

Uygulamanın sonucunda bir WEB yazılımı ortaya çıkmıştır. Bu WEB yazılımının arkasında iyi bir ekip çalışması olduğu görünmektedir. Harita çalışmasından sistem mimarisine, veritabanından yazılım geliştirmeye kadar değişik süreçler iç içedir.

Bir başka yazıda tekrar görüşmek dileğiyle.

Prism ile Silverlight MVVM ve Modüler Programlamaya Giriş

24 Eyl

Bir önceki yazımızda Silverlight MVVM yazılım tasarımı konusuna giriş yapmıştık ve anlaşılabilir olması açısından giriş seviyede bir örnek uygulama yaparak konuyu pekiştirmeye çalışmıştık. Bu yazımızda da Prism kütüphanelerini kullanarak modüler yapıda basit bir uygulama geliştirmeye çalışacağız. Bir önceki örnek MVVM uygulamızda Product model üzerinden View ve ViewModel yapılarını oluşturmuştuk. Bu yazıdaki uygulamada ise Product model ve View tarafını ayrı bir silverlight projesinde barındırıp ana silverlight projesi üzerine modül şeklinde ekleyeceğiz.

Bir önceki örnek uygulamadaki Model, View ve ViewModel yapılarını ProductModule adında ayrı bir silverlight uygulamasına çektik. Solution içerisindeki BasicModularity bizim ana silverlight uygulamamız. Yani ProductModule uygulaması, BasicModularity uygulaması üzerinde çalışacak ve BasicModularity.Web tarafından web yayınına sunulacak.

ProductModule uygulamasının bir modül olarak kabul edilebilmesi için IModule interface tipini implemente eden bir sınıfa sahip olması gerekmektedir. IModule interface tipi ise Microsoft.Practices.Prism.Modularity altında bulunmaktadır. ProductModule projesini modül halie getiren ise ProductModul sınıfıdır. Bu sınıfın içeriği aşağıdaki gibidir.


public class ProductModul : IModule
{
     private readonly IRegionManager manager;

     public ProductModul(IRegionManager manager)
     {
         this.manager = manager;
     }

     public void Initialize()
     {
         manager.RegisterViewWithRegion("ProductSaveRegion", typeof(Views.ProductView));
     }

}

IModule interface içerisinde Initialize adında bir metod bulunmaktadır. Bu metod modülün başlatılmasını sağlamaktadır. IRegionManager interface tipi ise modülün ana uygulamada hangi bölgeye yerleşeceğini belirleyen bir tiptir. Biz bu uygulamada modüldeki ProductView görüntüsünün ProductSaveRegion adındaki bir bölgede tutulmasını istedik. Biraz sonra bu bölgeyi ana uygulamada bir ItemControl belirleyeceğiz.

BasicModularity uygulaması yani ana uygulamamız tarafında modülleri barındıracak şekilde bir takım hazırlıklar yapmamız gerekmektedir.

Öncelikle Shell.xaml user kontrolü ekleyerek modülündeki ProductView için bir bölge(region) oluşturmalıyız.

ProductModule içerisinde işaret edilen bölgeyi oluturduk.

Artık modüllerin ana çatı tarafından tanınması ve yüklenmesi için gerekli olan başlangıç mekanizmasını oluşturmanın vakti geldi. Bu mekanizmanın ana sınıfı UnityBootstrapper denen tiptir. Bu tipten türeterek oluşturduğumuz sınıfımızın adı MainBootstrapper. Sınıfımızın içeriği aşağıdaki gibidir.


public class MainBootstrapper:UnityBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        return Container.Resolve<Shell>();
    }

    protected override void InitializeShell()
    {
        Shell shell =new Shell();
        Application.Current.RootVisual = shell;
    }

    protected override IModuleCatalog CreateModuleCatalog()
    {
        ModuleCatalog catalog = new ModuleCatalog();
        catalog.AddModule(typeof(ProductModule.ProductModul));
        return catalog;
    }

}

CreateShell metodu ana yapı olan Shell tipinden bir nesneye işaret etmektedir.

InitializeShell ise Application.Current.RootVisual UIElementine Shell nesnesini göstermektedir.

CreateModuleCatalog ise yüklenecek olan modllüeri göstermektedir.

App.xaml.cs içerisindeki Application_Startup metodunda ise MainBootstrapper başlatılmaktadır.


private void Application_Startup(object sender, StartupEventArgs e)
{

    MainBootstrapper boot=new MainBootstrapper();
    boot.Run();

}

Uygulamamız artık çalıştırılmaya hazır.

Bu yazımızda Pism ile ilgili detaylı bilgiler vermedim. Daha sonraki yazılarda kısmetse Prism nedir ne değildir şeklinde bir yazı hazırlayabilirim.

Tekrar görüşmek ümidiyle.

Örnek Uygulama Kodlarına Buradan Erişebilirsiniz.

Kaynakhttp://compositewpf.codeplex.com/

Silverlight MVVM Giriş ve Prism DelegateCommand

21 Eyl

Web projelerini ASP.NET MVC ile geliştirenlerden olduğum için Silverlight tarafında da kendi çabalarımla model view tarzı çalışmalarla uğraşmaktaydım. Silverlight tarafında da katmanları birbirinden izole eden böyle bir yapı var mı diye araştırırken MVVM(Model View and ViewModel) yazılım tasarımıyla karşılaştım.

Yazılım tasarımları yeni başlayanlar için pek bir şey ifade etmeyebilir. Fakat uzman yazılımcılığa adım attıktan sonra, geleneksel yöntemlerle işlerin çorbaya dönüştüğü ve içinden çıkılamaz bir hale geldiğini görenler çıkış noktası aramaya başlarlar. Böylece ilk başlarda saçma gelen yöntemler artık yazılımcı için tam anlamıyla can simidi olur. Bu yazımızda da Silverlight MVVM yazılım tasarımını, giriş seviyesindeki bir örnekle incelemeye çalışacağız.

MVVM yazılım tasarımındaki temel amaçlar:

  • Yazılımda esnekliğin sağlanması(Loosely Coupled),
  • Genişletilebilir bir yazılım oluşturulabilmesi(Open Closed),
  • Test edilebilir yazılımın oluşturulabilmesi,
  • Kod tekrarlarının önune geçilmesi (Clean Code) şeklinde sıralanabilir.

MVVM sayesinde Silverlight framework elementlerin(xaml tarfının) ve CLR (C#, VB gibi) kodlama tarafının birbirinden yalıtımı da sağlanabilir. Xaml ve Kod tarafında event paslaşmalarını Command Binding mekanizmalarıyla ortadan kaldırmak MVVM tasarımında işleri daha da kolaylaştırmaktadır.

Microsoft Pattern & Practices ürünlerinden olan Prism kütüphanesi sayesinde Desktop uygulamaları ve Silverlight uygulamalarında modülerliği ve yazılımda esnekliği sağlayan bir takım özellikler mevcuttur. Bu yazımızdaki örnek uygulamada command binding diye adlandırılan yapıdan bahsedeceğiz.

ViewModel içerisine tanımlanan bir ICommand nesnesi aracılığı ile View tarafından commanding işlemi gereçekleştirilebilmektedir. Tekrardan view tarafında tanımlanan button v.s gibi bileşenlerin event’lerini yakalayıp, iş operasyonlarını gerçekleştiren süreçleri view tarafına sokmamış oluruz. Yani kısaca herkes kendi yoluna gider.

Şimdi giriş seviyesinde bir örnek uygulama yaparak konuyu incelemeye başlayabiliriz. Örneğimize başlamadan önce Microsoft Pattern & Practices sitesinden Prism kütüphanelerini indirip bunlardan Microsoft.Practices.Prism referans olarak projemize eklemek gerekmektedir.

Örnek Uygulama

Örnek senayyomuz, bir Product tipinin arayüz ayrımının yapılması şeklinde olacaktır.

Model olarak Product adında basit bir temel tip belirliyoruz.


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
    public override string ToString()
    {
         return string.Format("Name: {0}, Price: {1}", Name, Price);
    }

}

Bu tipimizi görünüm arayüzünde (xaml tarfına) temsil edecek bir tip oluşturmamız gerekiyor. Bu tip aslında bizim ViewModel dediğimiz yapıyı oluşturacak olan tiptir.


public class ProductViewModel
{
    private readonly Product product;
    public ICommand SaveCommand { get; set; }
    public Product Product { get { return product; } }

    public ProductViewModel()
    {
        product = new Product {Name = "Notebook", Price = 1500};
        SaveCommand = new DelegateCommand<object>(OnSave);
    }

    private void OnSave(object obj)
    {
        MessageBox.Show(product.ToString());
    }

}

Yukarıda görüldüğü gibi ViewModel tipimizin adı ProductViewModel şeklindedir. Bu tip, içerisinde Product tipini barındırıyor ve kaydetme işlemini tetikleyecek olan ICommand tipinde bir nesne barındırıyor. Constructor içerisinde ürün bilgileri ve Command işlemini yapacak olan nesnenin oluşturulma işlemi gerçekleştiriliyor. DelegateCommad tipi, Microsoft.Practices.Prism.Commands

İçerisinde bulunmaktadır. Bizim senaryomuzda herhangi bir kayıt söz konusu olmadığından kaydetme işlemini MessageBox mesajı ile geçiştiriyoruz.

View tarafında da kayıt bilgilerinin alındığı bir form tasarımı oluşturacağız. Ayrıca View tarafında DataContext olarak az önce oluşturduğumuz ViewModel tipini göstereceğiz. View kontrolümüz ProductView.xaml şeklindedir ve içeriği aşağıdaki gibidir. Cs kod tarafında hiç bir işlem yapılmamıştır.

Hazırlık aşaması tamam olduğuna göre artık oluşturduğumuz View, Mainpage.xaml içerisine yerleştirilebilir.

Burada dikkat etmemiz gereken noktalardan biri, button click event’ine hiç kod yazılmaması. Bunun yerinde Command mekanizmasının kullanılmasıdır. Command binding, MVVM tasarım desenini kullanmayı kolaylaştıran yöntemlerden biridir. Eğer button click event kullanılsaydı View tarafında View tarafında yapılmaması gereken bir işlem yapılmış olacaktı.

Sonuç olarak Solution penceremiz şu şekildedir. Klasörleri kendim oluşturdum, yani visual studio tarafından hazır olarak sunulan bir MVVM projesi yok.

Tekrar görüşmek ümidiyle.

Örnek Uygulama Kodlarına Buradan Erişebilirsiniz.

Silverlight Commanding Kavramı

20 Eyl

Silverlight tarafında çalışma zamanında(runtime) yapılmasına gerek duyulan implementasyonlar yüzünden MVVM gibi yazılım tasarımlar gün yüzüne çıkmıştır. Bu tarz kod yazım tasarımları, ürünlere bağlı değildir aslında. Ancak ürün sahipleri, yeni sürümlerini çıkarırken, geliştiricilere yardımcı olabilmek ve güncelliği korumak adına bir dizi eklemeler yapabilmektedirler. Silverlight tarafında  Silverlight 4 ile birlikte gelen Commanding yapısı da bize kolaylık sağlayacak özelliklerden biridir.

Commading yapısının bize sağlayacağı kolaylıkların başında, event ve eventhandler mekanizmalarıyla uğraşmadan kod akışını düzenlemek geliyor. Yani normal kodlama yaparken alışkanlıklarımızdan biri şudur: arayüz(xaml) tarafındaki bir bileşende gerçekleşecek olan bir olay aynı xaml dosyasına bağlı *.cs kod dosyasında yaparız. Commanding yapısında ise gerçekleşen olayı ayrı bir sınıf aracılığıyla yaparız. Diğer bir husus ise modüler programlama yaparken sağlayacağı kolaylıktır ki bizi en çok rahatlatacak olan özelliklerinden biri de budur. Bir modül oluşturduğunuzu düşünün(ayrı bir silverlight dll). Bu modül üzerinde görsellikle diğer katmanlar rahatlıkla ayrılabilir.

En basit şekliyle event yakalama işlemini gösteren bir uygulamayla işe başlayalım.

Örnek Uygulama

Bu örneğimizde bir butona tıkladığımızda verilen mesajı hem cs kodundaki event ile hem de command mekanizmasıyla gerçekleştireceğiz.


private void button1_Click(object sender, RoutedEventArgs e)
{
      MessageBox.Show("Mainpage.cs tarafındaki event");
}

Yukarıdaki kod ile alışılagelmiş ve en basit haliyle butona tıklayıp sonuç alma işlemini gerçekleştirmiş olduk. Bu işlemi bir de comman binding yardımıyla ile yapalım.

public class MessageCommand:ICommand
{
     public bool CanExecute(object parameter)
     {
        return true;
     }
     public void Execute(object parameter)
     {
         MessageBox.Show("MessageCommand tarafından gelen event.");
     }

     public event EventHandler CanExecuteChanged;
}

Öncelikle ICommand arayüzünü uygulayan MessageCommand bir sınıf oluşturduk. Bu sınıf, ICommand ile gelen CanExecute, Execute, CanexecuteChanged üyelerini de barındırıyor.

Belirtmekte fayda var. ICommand arayüzünün profili de şu şeklidedir.

public interface ICommand
{
       event EventHandler CanExecuteChanged;
       bool CanExecute(object parameter);
       void Execute(object parameter);

}

Şimdi xaml tarafında MessageCommand tipine butonu bağlayabiliriz.

Bu uygulama, command binding işleminin nasıl yapıldığını en düşük seviyede anlatan bir uygulamadır. İleri seviyedeki uygulamalar ise MVVM(Model View and ViewModel) tasarım deseni uygulandığı örneklerde gösterilmektedir. önümüzdeki yazılarda bu konuya değinmeye çalışacağız.

Tekrar görüşmek ümidiyle.

Esri Silverlight Api Query SpatialReference Problemi

11 May

Esri silverlight API kullananların yaşadıkları sorunlar dizisinden birisiyle daha karşı karşıya kalabilirsiniz. Bu sorun, harita üzerindeki bir yere sorgu yapmak istediğinizde karşımıza çıkıyor. Daha açık bir ifadeyle bir Query sonucunda sorgulanan bir yere harita züerinde çizim yapmak istediğimizde karşı karşıya kalabilmekteyiz. Örneğin bir şehir seçildiğinde o şehri harita üzerinde maviye boyamak istediğimizde sonuç alamayabiliriz.

Ben bu sorunu Esri Silverlight V2.4 dll ve Arcgis 10 Service yayınlarında yaşadım. Sorunun kaynağında yatan ise Query yapılan Layer ile Map Layer arasındaki SpatialReference farkıydı.

Sorgu:


private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
      QueryTask queryTask = new QueryTask("http://domain/ArcGIS/rest/services/sehirler/MapServer/0");

      queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;

      ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
      query.Where = "ILADI=" + "'Sample'";
      query.ReturnGeometry = true;
      query.OutFields.Add("*");
      queryTask.ExecuteAsync(query);

}

Map SpatialReference
Query SpatialReference

iki şekilde görüldüğü üzere sorgu yapılan Layer ve Map Layer arasında SpatialReference Farkı var. Bu farkı gidermek için sorguda kiük bir değişiklik yaparak SpatialReference farklılığını gideriyoruz.

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{

       QueryTask queryTask = new QueryTask("http://domain/ArcGIS/rest/services/sehirler/MapServer/0");

       queryTask.ExecuteCompleted += QueryTask_ExecuteCompleted;

       ESRI.ArcGIS.Client.Tasks.Query query = new ESRI.ArcGIS.Client.Tasks.Query();
       query.Where = "ILADI=" + "'Sample'";
       query.ReturnGeometry = true;
       query.OutFields.Add("*");
       query.OutSpatialReference = MyMap.SpatialReference;
       queryTask.ExecuteAsync(query);

}

Bu işlemin ardından iki Spatial referans eşitlenir ve sorun ortadan kalkar. Map üzerindeki GraphicsLayer zerinde yapılmak istenen çizim işlemi de gerçekleşir.

GraphicsLayer

Eğer SpatialReference eşitlemesi yapılmasaydı, koordnat sistemi farkları yüzünden bu çizim işlemi başarısız olacaktı.

Silverlight Invalid Charecter Encoding Sorunu

25 Nis

Silverlight ortamında bazı proje şablonlarını kullanırken dile özgü karakterlerin kullanılması sonucu hatalarla karşılaşabilmekteyiz. Bu hatalardan biri de benim başıma geldi. Esri Silverlight API kullanırken hazır şablonlardan birini seçip edit etmeye başladığımda design sayfasında bir hata oluştu. Hatanın sebebi Türkçe karakterler kullanmam idi. Oluşan hata şu şekildeydi.

Error  1   Cannot resolve reference assemblies. Please check the reference assemblies. Invalid character in the given encoding. Line 116, position 53.  

Proje template oluşturulurken muhtemelen global ayarlar seçilsin şeklinde ayarlanmış olmalı ki ayarlarda Türkçe encoding seçiliydi.

Bu ayarı UTF-8 yapmalıydım. Bu işlem için aşağıdaki yolu izledim. File -> Advenced Save Options…

Encoding seçeneklerinden de Unicode(UTF-8 with signature) – Codepage-65001 seçeneğini seçip OK tuşuyla devam ettim.

Ardından projeyi bir kez derlediğimde sorun ortadan kalktı. İşte mutlu son.

Tekrar görüşmek dileğiyle.

Silverlight Client Access Policy ve Cross-Domain sorunu

8 Eyl

Bu yazımızda silverlight uygulamasına başka bir site veya projedeki servisi referans verdiğimizde karşılaşılan sorunlardan ve çözümlerinden bahediyor olacağız.

Sorun: Tarayıcıların çalıştıkları domain dışından veri alma ve gönderme sorunu. Bu demek oluyor ki silverligth uygulamsından, dışardaki bir uygulamaya ulaşmak istediğimizde cross-domain problemi ile karşılaşacağız.

Bir uygulama üzerinden gidecek olursak, bir solution üzerine CrossService adında bir WCF Service Application birde Silverlight Application ekleyerek başlayabiliriz.

CrossService projesine başka bir alan adı muamelesi yaparak FarService adında bir servis ekliyoruz. Bu servisimiz içerisinde basit olması açısından mesaj veren bir metod barınmaktadır.
IFarService interface


[ServiceContract]
public interface IFarService
{
    [OperationContract]
    string  ServiceMessage();
}

FarService sınıfı


public class FarService : IFarService
{
     public string ServiceMessage()
     {
       return String.Format("Ben Uzak servisten geliyorum. Tahih :{0}", DateTime.Now);
     }
}

Silverlight uygulamamızın barındığı web uygulamasına ise aynı domainde bulunduğunu belirtmek açsından LocalService adında bir servis ekliyoruz.

ILocalService interface

[ServiceContract]
public interface ILocalService
{
    [OperationContract]
    string  ServiceMessage();
}

LocalService sınıfı

public class LocalService : ILocalService
{
    public string ServiceMessage()
    {
         return String.Format("Ben Yakın servisten geliyorum. Tahih :{0}", DateTime.Now);
    }
}

Şu anda servislerimiz hazır ve uygulamaya dahil edilmeye hazır.
Silverlight uygulamamıza Add Service Reference… diyerek referansları ekliyouz.

Referanslar eklendiğinde aşağıdaki görüntü oluşacaktır.

Artık servis referansları yardımıyla servislerdeki ServiceMessage() metodlarını çağırabiliriz.

MainPage.xaml sayfasının tasarım kısmını şu şekilde düzenliyouz.

Kod kısmına gelecek olursak:

public partial class MainPage : UserControl
{
    FarServiceReference.FarServiceClient uzakServis
                  = new FarServiceReference.FarServiceClient();

    LocalServiceRefference.LocalServiceClient yakinServis
                  = new LocalServiceRefference.LocalServiceClient();

    public MainPage()
    {
        InitializeComponent();
    }

    private void btnUzak_Click(object sender, RoutedEventArgs e)
    {
        uzakServis.ServiceMessageAsync();
        uzakServis.ServiceMessageCompleted += (snd, ea) =>
        {
            lblUzak.Content = ea.Result;
        };
    }

    private void btnYakın_Click(object sender, RoutedEventArgs e)
    {
        yakinServis.ServiceMessageAsync();
        yakinServis.ServiceMessageCompleted += (snd, ea) =>
        {
           lblYakin.Content = ea.Result;
        };
   }
}

Görüldüğü üzere iki butondan biri uzak servisi diğeri yakın servisi çağırıyor olacak. Sonrasında servislerden gelen mesajlar  Label üzerine aktarılıyor olacaktır.

Yakın serviste bir sorun yok şu anda. Acak uzak servis için CrossService projesi içinde clientaccesspolicy.xml adında bir dosya mevcut. Silverlight uzak alan adına gittiğinde bu dosya mevcut mu diye bakar. Ki bu dosya içierisindeki ayarlara göre erişim yetkisine sahip mi değilmi anlayacak.

Xml dosya içeriği şu şekilde olacaktır:

 <?xml version="1.0" encoding="UTF-8"?>
 <access-policy>
   <cross-domain-access>
    <policy>
     <allow-from http-request-headers="*">
      <domain uri="*"/>
     </allow-from>
    <grant-to>
      <resource include-subpaths="true" path="/"/>
    </grant-to>
    </policy>
  </cross-domain-access>
 </access-policy>

Dikkat: Eğer clientaccesspolicy.xml dosyası uzak uygulamada olmasaydı şu şekilde bir sorunla karşılaşacaktık.

Hata: “An error occurred while trying to make a request to URI ‘http://localhost:1763/FarService.svc’. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details.”

Uygulamanın çalışan kodunu buradan indirebilirsiniz. Umarım faydalı olmuştur. Herkese iyi çalışmalar.