Resim: Cross-domain erişim yapısı.
Cross Domain Restrictions’dan kısaca bahsetmek gerekirse; bir güvenlik önlemi olarak, Silverlight kendi çalışma alanı (domain) sınırları dışında çalışma izni vermemektedir.
Bu yazımızdaki örneğimizde kendi local bilgisayarımızda oluşturacağımız iki farklı domain ile konuyu ele alacağız.
1. domain : http://localhost:1283 (prolemizin debug modda çalıştığı durum)
2. domain : http://localhost/test (uygulamayı publish ettiğimiz yer)
Amacımız, Silverlight uygulamamızın localhost/test etki alanından, localhost:1283'de bulunan servise erişmeye çalışmak olacak.
ASP.NET tarafında bize veri iletimini sağlaması amacıyla bir Silverlight-enabled WCF Service oluşturalım.
Solution Explorer üzerinde resimdeki gibi bir Silverlight uygulaması üzerinde çalıştığımızı varsayalım.
public string HelloWorld()
{
return "Hello World";
}
ServiceReferance.ClientConfig dosyasının içeriğine göz atalım. Endpoint address’in localhost 1283 no’lu port dan çalışacak şekilde otomatik olarak yazıldığı görülecektir.
public partial class Page : UserControl
{
private ServiceReferance.Service1Client myService = null;
public Page()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
myService = new SilverWebServiceTestProj.ServiceReferance.Service1Client();
myService.HelloWorldCompleted += myService_HelloWorldCompleted;
myService.HelloWorldAsync();
}
private void myService_HelloWorldCompleted(object sender, SilverWebServiceTestProj.ServiceReferance.HelloWorldCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show(e.Result);
}
else {
MessageBox.Show(e.Error.Message);
}
} }
Page.xaml’a hiçbir kod satırı eklemeden F5 ile debug modda projemizi derleyip çalıştırdığımızda herhangi bir hata ile karşılaşmadan “Hello World” mesajı ile karşılaşacağız.
Şimdi uygulamamızı faklı bir etki alanına (localhost/test) publish edelim ve localhost:1283 adresinde bulunan WCF servisimize erişmeye çalışalım.
ASP .NET projemize sağ tıklayarak Publish seçeneğini seçelim. Local makinemizde oluşturacağımız test isimli dizine publish ediyoruz. (wwwroot/test)
Buradaki hatayı almamak için 2 farklı yöntem ele alacağız.
İlk yöntemimiz de erişmeye çalışacağımız etki alanının çağrımıza izin vermesi. Bunun için Server taraftaki projemize clientaccesspolicy.xml isimli dosyayı ekleyelim. İçeriğini aşağıdaki gibi hazırlayalım.
{
private ServiceReferance.Service1Client myService = null;
public Page()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Page_Loaded);
}
private void Page_Loaded(object sender, RoutedEventArgs e)
{
int lastIndex = HtmlPage.Document.DocumentUri.AbsoluteUri.LastIndexOf("/");
string basePath = HtmlPage.Document.DocumentUri.AbsoluteUri.Substring(0, lastIndex);
string serviceAddress = string.Concat(basePath, "/Service1.svc");
myService =
new SilverWebServiceTestProj.ServiceReferance.Service1Client(new BasicHttpBinding(),
new EndpointAddress(serviceAddress));
myService.HelloWorldCompleted += myService_HelloWorldCompleted;
myService.HelloWorldAsync();
}
private void myService_HelloWorldCompleted(object sender, SilverWebServiceTestProj.ServiceReferance.HelloWorldCompletedEventArgs e)
{
if (e.Error == null)
{
MessageBox.Show(e.Result);
}
else {
MessageBox.Show(e.Error.Message);
} } }