Web Servisi Oluşturmak

Eyl 06, 2013
  1. Basit bir Web servisi oluşturmak için File (Dosya) -> New (Yeni) -> Web Site  yolu izlenmektedir. Burada ASP.NET Web servisleri seçilecektir. Böylece ".asmx"uzantılı bir dosya oluşturulur.



    AssemblyInfo.cs : Bir "assembly"’nin sürüm bilgisi gibi bilgilerini düzenlemek için kullanılan dosyadır. Tüm .NET projelerinde yer alan bir dosyadır.
    Service1.asmx ve Service1.asmx.cs : Bu iki dosya Service1.asmx ve "codebehind" dosyası olan Service1.asmx.cs dosyaları bir Web Servisini oluştururlar. Service1.asmx’in görevi IIS tarafından Web Servisinin bulunabilmesini sağlamak ve Web Servisi için giriş noktası olmaktır. Service1.asmx.cs dosyası yazılan program kodlarını içeren dosyadır. ASP.NET uygulamalarında olduğu gibi uygulama derlendikten sonra oluşan ".dll" dosyasında bu kodlar yer alır.

  2. Derleme sonrasında oluşturulan Web servisi, verilen "URL" ile herhangi bir tarayıcıdan görüntülenebilir.

  3. Bu uygulamada kullanılmak üzere iki adet metod yaratılmıştır. Bunlar "cevapMessage" ve "sendMessage" olarak adlandırılmıştır. Bu metodların internet üzerinde sunulabilmesi için System.Web.Services sınıfından türetilen [WebMethod] kod parçacığı kullanılmalıdır.

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        public Service ()
        {
            //Uncomment the following line if using designed components
            //InitializeComponent();
        }

        static public Queue Kullanici1 = new Queue();
        static public Queue Kullanici2 = new Queue();
     
        [WebMethod]
        public string sendMessage(string mesaj, int IDkullanici)
        {
            if (IDkullanici==1)
            {
                Kullanici2.Enqueue(mesaj);
                return mesaj;
            }
            else
            {
                Kullanici1.Enqueue(mesaj);
                return mesaj;
            }      
        }
        public string yollanacakMesaj = "";

        [WebMethod]
        public string cevapMessage(int IDkullanici)
        {
            if (IDkullanici==1)
            {
                yollanacakMesaj = "";
                for (int i = 0; i < Kullanici1.Count; i++)
                {
                    yollanacakMesaj += Convert.ToString(Kullanici1.Dequeue());
                }
                return yollanacakMesaj;
            }

            else
            {
                yollanacakMesaj = "";
                for (int i = 0; i < Kullanici2.Count; i++)
                {
                    yollanacakMesaj += Convert.ToString(Kullanici2.Dequeue());
                }
                return yollanacakMesaj;           
            }       
        }


  4. Yukarıdaki örnek kodda bir Web servisi üzerinden mesajlaşan iki adet kullanıcı için bir servis yazılmıştır. Bu servisin http://localhost:1562/MsnSunucu/Service.asmx "URL"'sinde metodların tanımlarına ve SOAP (Simple Object Access Protocol) (Basit Nesne Bağlantı Protokolü) mesajlarına ulaşılabilir.

  5. Sunucudaki metodlardan birine ulaşıp "Invoke" (başvuru) edilirse, sunucunun döndüğü cevap gelecektir.



  6. Bu işlem sonucunda istenlen cevap sunucu tarafından "XML" biçiminde gönderilir.



  7. İstemcilerden biri bu Web servisine ulaşmak isterse XML servis istemci altyapısı bu dosyadaki tanımlamalara bakarak "proxy" nesnesini oluşturacaktır. Bunun yerine "wsdl.exe" dosyası konsoldan çağrılarak da istenilen özelliklerde "proxy" nesnesi oluşturulabilir. Servis tanımı WSDL (Web Services Description Language) (Web Servisleri Tanımlama Dili) olarak düzenlenmekte ve bu haliyle sunucuya giderek tanıtılmaktadır.

Web Servisleri İçin İstemciler

Bir Web servisini oluşturulduktan sonra bu servisi kullanarak, servisin sunduğu işlevleri kullanacak istemciler olacaktır. İstemcinin Web servisiyle haberleşerek yaptığı seçenekler veya yolladığı veriler serviste işlenerek istemciye geri yollanmaktadır. Web servisine bağlı istemci sayısı birden fazla da olabilir. Bir istemci oluşturduğumuzda bu bir Windows uygulaması, ASP.NET sayfası veya başka bir Web servisi olabilir. Bir istemci öncelikle Web servisine nasıl ulaşacağı bilgisine sahip olmalıdır. Daha sonra istemci WSDL ile sayfanın bilgilerine ulaşıp iletişimi sağlayacak "proxy" sınıfını oluşturur ve buradan türettiği nesneler yardımıyla Web servisinin sunduğu hizmetlere erişebilir. Kısa bir giriş yapıldıktan sonra bu basamaklar daha detaylı olarak incelenmeye başlanacaktır.

Daha önceden oluşturulmuş bir Web servisini kullanacak uygulama yazdıldığında öncelikli olarak o Web servisinin konumunun belirtilmesi gerekmektedir. Bu şekilde Web servisine bağlanarak uygulamalar çalıştırılabilir. Web servislerine yönlendirme işlemi, sunucu yazılırken proje sayfasından "Add Reference" (Referans Ekle)tıklanarak açılan ekranda çıkan adres çubuğuna Web servisinin adresi girilerek başlatılır. Eğer Web servisinin konumu bilinmiyorsa veya o işlevi yapan bir Web servisi aranıyorsa UDDI (Universal Description, Discovery and Integration - Evrensel Tanımlama, Keşif ve Bütünleme) kullanılmalıdır. UDDI sunucular üzerindeki Web servislerin bulunmasını kolaylaştıran bir sistemdir. Keşif dosyalarında istemci yinede keşif dosyasının bulunduğu belli bir adresi bilmek zorundadır. Birden fazla Web servisinin tek bir dizin altında toplanması şüphesiz işlemi kolaylaştıracaktır, ancak yinede Web sitesi içinde dolaşarak ".disco" uzantılı bağlantılarını aramaksızın şirketin sunduğu Web servislerin incelenmesini kolaylaştırmaz.

UDDI’ın bu bağlamda amacı, işletmelerin sahibi oldukları Web servislerini tanıtabilecekleri, tanımını yapabilecekleri bir alan sağlamaktır. Yani UDDI’ın yaptığı şey aslında bir arama motorundan farksızdır.

UDDI için üç ana başlık vardır:

  • İş için iletişim sağlayan beyaz sayfalar.
  • XML Web servislerini kategoriler halinde listeleyen sarı sayfalar.
  • Her bir servis hakkında ayrıntılı teknik bilgi sağlayan yeşil sayfalar.

    Kullanılacak Web servisini seçtikten sonra istemci ile aradaki bağlantıyı sağlamak için "proxy" sınıfı yaratılması gerekmektedir. Bunu yapmanın iki yolu vardır. Bunların her ikisi de burada açıklanmaktadır. Öncelikle daha kolay olan metod Visual Studio.NET kullanılarak Web servisine bağlanıp Web servisinin WSDLdosyasını indirip "proxy" sınıfını yaratmaktır. Bunun yanı sıra "wsdl.exe" dosyası kullanılarak komut satırı üzerinden "proxy" sınıfı yaratılmaktadır. 

  1. Burada Web servisi seçilerek kullanıma hazır hale getirilmiştir. "Add Reference" (Referans Ekle) butonuna tıklandığında gerekli işlemleri Visual Studio yapmaktadır. Daha önce bahsedilen Web servislerini UDDI kullanarak yerel makinede, proje içerisinde veya Web'de arama seçenekleri de bu sayfaya gelmeden öncedir ve aşağıdaki şekildedir.



  2. Yukarıdaki metodun haricinde diğer bir kullanılan yöntem de "wsdl.exe" dosyası kullanılarak "proxy" sınıfı oluşturmaktır. Bunun için genellikle “C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin\WSDL.exe” gibi bir konumda bulunan uygulama dosyası çalıştırılır. Komut satırında açılan bu dosyaya belli parametreler girerek istenilen özelliklerde bir "proxy" sınıfı yaratılır.



     
  3. Yukarıda "wsdl.exe" dosyasının alabileceği parametreler görülmektedir. Buradaki kurallara uygun olarak "proxy" sınıfı oluşturulur. Burada "/language" veya kısacası "/l" olan komutla istemcinin yazıldığı dili seçeriz. Yapılan uygulama C# ile yazılmış olduğundan ".cs" kullanılmaktadır. Bunun haricinde "/out" veya"/o" ile dosyanın kaydedileceği konum seçilir. Bu konum ister sunucu üzerinde olmasını sağlayacak bir adres, ister yerel makinedeki bir dizin olabilmektedir.

  4. Oluşturulan aracı sınıf nesnesi kendi "namespace" (ad uzayı) hiyerarşisi içerisindedir. Bu yüzden aracı sınıflara erişirken "namespace" hiyeraşisini göz önünde bulundurmak gerekmektedir. "Namespace" hiyerarşisini ya tam hiyeraşi referansı verildikten sonra ya da gerekli "namespace"’ler "import" (dahil)edildikten sonra "new" (yeni) anahtar kelimesi ile aracı sınıftan bir nesne türetilmektedir.

  5. Aracı sınıf gelen metod çağrılarını XML Web servisine dönmektedir. XML Web servisinden dönen değerleri de kendisi geri dönememektedir. Aracı sınıftan türemiş bir nesne oluşturduktan sonra kolayca metodlarına erişilebilmektedir. 

    namespace Client_1
    {

        public partial class Form1 : Form
        {
            delegate void SetTextCallback(string text);

            private void SetText(string text)
            {         
                if (this.textBox1.InvokeRequired)
                {
                    SetTextCallback d = new SetTextCallback(SetText);
                    this.Invoke(d, new object[] { text });
                }

                else
                {
                    if (text != "" )
                    {
                        this..Text = this.textBox1.Text + "Kullanici2: " +text;
                    }

                    else
                        this.textBox1.Text += text;              
                }
            }

            public Form1()
            {
                InitializeComponent();
                System.Timers.Timer t = new System.Timers.Timer(1000);
                t.Elapsed += new System.Timers.ElapsedEventHandler(export);
                t.Start();
            }
            int IDkullanici = 1;

            private void button1_Click(object sender, EventArgs e)
            {
                localhost.Service ws1 = new localhost.Service();                    
                textBox1.Text += "Kullanici1: " + Convert.ToString(ws1.sendMessage((textBox2.Text),IDkullanici));
                textBox2.Text = "";          
            }

            void export(object o, ElapsedEventArgs a)
            {
                localhost.Service ws3 = new localhost.Service();                    
                SetText( Convert.ToString(ws3.cevapMessage(IDkullanici)));          
            }     
        }
    }

    Bu şekilde istemci oluşturulmuştur. Yazılan uygulamanın özelliğinden ötürü aynı formatta başka bir istemci de yazılması gerekmektedir. Böylece bu iki istemci Web servisi üzerinden haberleşebileceklerdir.