İlkay İlknur

just a developer...

MetadataResolver Tipini Kullanarak WCF Metadatasını Kullanmak

Merhaba Arkadaşlar,

Bu yazımızda MetadaResolver isimli tipi kullanarak WCF servisleri ile ilgili dışarıya sunulan metadata bilgilerinin nasıl kullanılacağını işliyor olacağız . Bildiğimiz üzere WCF tarafındaki servislerimiz birtakım farklı bindingler üzerinden ve farklı endpoint adresleri kullanılarak dışarıya açılabilmekte. Bu adresleri ve binding konfigürasyonlarını uygulamaların konfigürasyon dosyalarından yapabileceğimiz gibi servisleri host ettiğimiz ortamlarda programatik(self-hosting) olarakta yapabilmekteyiz.

Şimdi isterseniz basit bir örnek üzerinden ilerleyelim ve somut örnekler üzerinden konuşalım.

[ServiceContract]
public interface IMathService
{
    [OperationContract]
    double Add(double x, double y);

    [OperationContract]
    double Substract(double x, double y);
}

 İlk olarak yukarıdaki ServiceContractına sahip basit bir servis tanımlayalım.

public class MathService:IMathService
{
    #region IMathService Members

    public double Add(double x, double y)
    {
        return x + y;
    }

    public double Substract(double x, double y)
    {
        return x - y;
    }

    #endregion
}

 Son olarak ise servisimiz ile ilgili binding ayarlarını ve endpoint ayarlarını gerçekleştirelim.

Şimdi yukarıda gerçekleştirdiklerimizi kısaca özetlersek;

  • Öncelikle gerçekleştirimini yapacağımız WCF servisimizin sahip olacağı Service Contract'ı tanımladık.(IMathService)
  • Sonrasında ise tanımladığımız Service Contract'ını implemente eden servisimizin geliştirimini gerçekleştirdik. (MathService)
  • Son olarak ise WCF'in ABC(Address, Binding ,Contracts)'si olarak nitelendirdiğimiz bu özelliklerden Contract özelliğini yukarıdaki adımlarda tanımlamıştık. Geriye kalan Address ve Binding tanımlamalarını ise config dosyasında gerçekleştirdik.

Config dosyasına baktığımızda MathService isimli servisimizin 3 faklı adres üzerinden ve farklı binding özellikleri ile dışarıya sunulduğunu görmekteyiz. Bunlar,

Yukarıda son olarak bahsettiğimiz endpoint adresine baktığımızda bu adresin MexHttpBinding kullandığını görmekteyiz. Bu şekilde tanımlanan endpointlere baktığımız zaman bu endpointler üzerinden servis'in metadatasının dışarıya sunulduğunu görmekteyiz. config dosyasına baktığımızda da zaten kullanacağı contractın diğer endpointlerin kullanacağı contract'tan farklı olduğunu anlayabiliriz. Servis metadatasını dışarıya sunan endpointler özel olarak IMetadataExchange interface'ini kullanırlar.

Şimdi gelelim bu servis metadatasını nasıl kullanabileceğimize. Zaten yazımızın esas konusunu da bu oluşturmakta. :)

Bir servisin metadatası ne olabilir diye düşündüğümüzde aslında aklımıza yine WCF servisinin Address - Binding - Contract (ABC) 'si gelmekte. Servisin sahip olduğu ABC bilgileri doğrudan servisin metadatası olarak elde edilebilmekte. Şimdi gelelim bu metadayı nasıl kullanabileceğimize.

System.ServiceModel.Description namespace'i içerisinde MetadataResolver isimli bir tip bulunmakta. Bu tip içerisine baktığımızda statik olarak tanımlanmış BeginResolve, EndResolve ve Resolve metotlarını görmekteyiz. Bu metotlar parametre olarak servis metadatasının dışarıya sunulduğu adresi alarak buradaki metadata bilgisini elde edebilmekteler. Metodun dönüş tipine baktığımızda ise EndpointCollection tipini görmekteyiz.

Şimdi basit bir Console Application yaratalım ve bize gelen servis metadatasını kullanarak runtime sırasında farklı bindingleri kullanan servislere bağlanalım ve işlemler gerçekleştirelim.

Not : System.ServiceModel.Description namespace'i System.ServiceModel assemblysi içerisinde bulunmaktadır.

static void Main(string[] args)
{
ServiceEndpointCollection collection = MetadataResolver.Resolve(typeof(MathService),�
 new System.ServiceModel.EndpointAddress("http://localhost:8080/MathService/mex"));

   foreach (ServiceEndpoint endpoint in collection)
   {
       Console.WriteLine("Servis bağlantısı {0} adresi üzerinden 
{1} bindingi kullanılarak oluşturulmakta",
        endpoint.Address.ToString(),endpoint.Binding.Name);
       MathServiceClient client = new MathServiceClient(endpoint.Binding,
                                  endpoint.Address);
       Console.WriteLine(client.Add(3, 2));
   }
}
Yukarıdaki kodlara baktığımızda ilk olarak MathService isimli WCF servisinin metadatasının dışarıya sunulduğu mex uzantılı adresi MetadataResolver tipinin statik Resolve metoduna vererek buradaki endpoint bilgilerinin alınmasını sağlıyoruz. Daha sonrasında ise buradaki her endpointe göre uygun WCF Servis clientlarını oluşturarak işlemlerimizi gerçekleştiriyoruz. Uygulamayı çalıştırdığımızda ise aldığımız sonuçların ekran görüntüsünü ise aşağıda görebilirsiniz. Sonuç olarak baktığımızda WCF Servislerimizle ilgili metadata bilgilerinin dışarıya sunulduğu endpointler özellikle dinamik olarak birtakım bağlantıların kurulabileceği yada ilgili wcf servislerine nasıl bağlanılacağı ile ilgili konfigürasyonların yapılabileceği durumlarda bizlere oldukça yardımcı olmakta. Sizler de bu gibi durumlarda hiç tereddüt etmeden bahsettiğimiz MetadataResolver tipini kullanabilirsiniz. Görüşmek Üzere,


Yorum Gönder