İ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,

No Responses to “MetadataResolver Tipini Kullanarak WCF Metadatasını Kullanmak”

RSS feed for comments on this post. TrackBack URL

Leave a Response