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.