19 Haziran 2012 Salı

C# ile Web Servis Nasıl Yazılır ?

C# ile bir Web Servis nasıl yazılır ve nasıl kullanılır.

Bu makalemde sizlerle birlikte C# dili bir Web Servis oluşturup bu Web servis ile Merkezi olan Database'miz ile Clientta bulunan bir masaüstü uygulamasını haberleştiriceğiz. Yapacağımız uygulamada öncelikle basit bir Masaüstü uygulaması yapacağız ve bu uygulama Input alanlarından girilen "kullanıcı adı" , "parola" bilgisine sahip bir kullanıcı Web Serverda bulunan veritabanımızda kayıtlımı değilmi kontrolünü yapacağız ve eğer kullanıcı sistemde kayıtlı ise kullanıcı bilgilerini formda ki Datagrid'e yükleyeceğiz.

Masaüstü uygulamamızın tasarımını basit bir şekilde oluşturduktan sonra artık Web Servisimizi yazmaya başlayabiliriz.



Web Servisimizi oluşturmak için Visual Studio yu açıyoruz ve  File > New Project > Visual C# > Web > ASP.NET Web Service Application yolunu izleyip WebService1 isminde bir Web Servis olşturuyoruz.


























"OK" diyerek Web Servisimizin oluşmasını bekliyoruz ve ilk Web Servisimizi yazmış oluyoruz ve bu adımla birlikte Visual Studio bizim için Hem Web Servisimizi oluşturdu hemde bize örnek olması açısından HelloWorld() isminde bir Web Method oluşturdu.Biz aslında Web Servis çağırırken bu servisin içindeki Web Method'ları tetikleriz.




























Web Servisimizi oluşturduktan sonra üzerinde işlem yapabileceğimiz bir database oluşturalım ve bu Database içerisinede  UserID (Otomotik Artan Unique bir alan), Username, Password, Age alanlarından oluşan USERS diye bir tablo oluşturalım.Oluşturduğumuz tablomuza sonradan kullanılmak üzeri bir kaç satır veri girelim.



















Tablomuzuda oluşturduğumuza göre şimdi Masaüstü uygulamasından gelen kullanıcı adı paraola bilgisine göre kullanıcının sistemde var olup olmadığını kontrol eden bir "Stored Procedure" yazabilriz.


//Sistemde kullanıcının var olup olmadığını kontrol eden eğer kullanıcı sistemde var ise bu kullanıcının bilgileri getiren bir Stored Procedure yazalım
ALTER PROCEDURE CheckUser
(
       @Username varchar(50),
       @Password varchar(50),
       @Status smallint output --Eğer Dönen Değer 1 ise kullanıcı mevcut eğer 0 ise kullanıcı sistemde mevcut değil
)
AS
       SET @Status = 0

       SELECT @Status = COUNT(*)
         FROM USERS
        WHERE Username = @Username
          AND Password = @Password

       IF @Status > 0 --Sistemde Kullanıcı Mevcut ise bilgilerini dön
       BEGIN
             SELECT UserID,
                       Password,
                       Age,
                       Username
               FROM USERS
              WHERE Username = @Username
                AND Password = @Password
       END;
      
       RETURN

Şimdi Web Servis tarafına geçip bu yazdığımız proesüdüre parametreleri geçip çağıran bir method yazalım.



        private string connString = “Buraya Connection String Gelecek”;

        private static DataTable dtableUserInfo;

        private bool checkUser(string username,string password)
        {          
            //WebServisten Datatable türünde veri dönecekseniz mutlaka datatable nesnenize isim vermelisiniz
            //dTableUsers.TableName = "USERS"; 

            SqlConnection sConnection = new SqlConnection(connString);
            //Çağırılacak prosedür adı ve bağlantı nesnesi
            SqlCommand sCommand = new SqlCommand("CheckUser", sConnection);
            sCommand.CommandType = CommandType.StoredProcedure;

            SqlParameter sParamUsername = new SqlParameter("@Username", SqlDbType.VarChar, 50);
            sParamUsername.Value = string.IsNullOrEmpty(username) ? Convert.DBNull : username;

            SqlParameter sParamPassword = new SqlParameter("@Password", SqlDbType.VarChar, 50);
            sParamPassword.Value = string.IsNullOrEmpty(password) ? Convert.DBNull : password;

            SqlParameter sParamStatus = new SqlParameter("@Status", SqlDbType.SmallInt);
            sParamStatus.Direction = ParameterDirection.Output;

            sCommand.Parameters.Add(sParamUsername);
            sCommand.Parameters.Add(sParamPassword);
            sCommand.Parameters.Add(sParamStatus);

            sConnection.Open();
            SqlDataAdapter dAdapter = new SqlDataAdapter(sCommand);
            dtableUserInfo = new DataTable();
            dAdapter.Fill(dtableUserInfo);

            sConnection.Close();

            return sParamStatus.Value.ToString() == "1" ? true : false;
        }

Prosedürümüzü Web Servis tarafında çağıracak Methodumuz da hazır olduğuna göre Artık Web Servis içerisine Web Method'larımızı yazabiliriz

              //Kullanıcı varmı yokmu diye kontrol yapan web method
        [WebMethod]
        public bool CheckUserInfo(string username, string password)
        {
            return checkUser(username, password);
        }

        //Kullanıcı bilgilerinin getiren WebMethod
        [WebMethod]
        public DataTable GetUserInfo(string username,string password)
        {
            //Eğer kullanıcı bilgileri sistemde var ise dön
            if (checkUser(username, password))  
            {
                //WebServisten Datatable türünde veri dönecekseniz mutlaka datatable nesnenize isim vermelisiniz
                dtableUserInfo.TableName = "UserInfo";

                return dtableUserInfo;
            }
            else
                return null;
        }


Web Servisi yazma işlemi bittikten sonra F5 tuşu ile projemizi çalıştırıp gelen tarayıcı ekranındaki linki alıp daha sonraki aşamalar için saklıyoruz. bende oluşan link (http://localhost:49829/Service1.asmx)

















Şimdi yazdığımız Masaüstü uygulaması’na yazdığımız Web Servisi tanıtıp Web Servis içerisindeki Web Methodlara Erişelim.Bunun için öncelikle solution Explorerdan Projemize sağ tıklayıp gelen menüden “Add Service Reference” linkini tıklayalım ve Açılan ekranda Address alanına Web Servisimizin adresini yazıp Go butonuna basmalıyız ve projemizin Web Servis ve içerdiği WebMethodlarını bulması için çok kısa bir süre beklemeliyiz.İşlem tamamlanınca İsterseniz Web Servisinizin NameSpace alanını değiştirebilirsiniz ben değişiklik yapmadan devam edeceğim.Ok butonuna basılarak Web Servisimizi projemize referans olarak ekledik.Şimdi bu servis içerisindeki Web Methodları tetikleyelim.(Uygulamanızı derlemeden önce Webservisin çalışır durumda olduğundan emin olun)






























Makalemizin başında tasarladığımız formdaki  “Web Servise Bağlan ve Sorgula” butonunun “Click” Event’ına aşağıdaki kodları yazınca Web Servisimiz’deki WebMethodlar vasıtasıyla Merkezdeki Database’de kullanıcı varmı yokmu bilgisini sorgulayıp eğer kullanıcı varsa bilgileri’ni getir ve ekrandaki “Datagrid” nesnesinde göster demiş olduk.


        private void btnConnecttoWebServer_Click(object sender, EventArgs e)
        {
            ServiceReference1.Service1SoapClient service = new ServiceReference1.Service1SoapClient();

            if (service.CheckUserInfo(txtUsername.Text.Trim(), txtPassword.Text))
            {
                //Eğer kullanıcı sistemde tanımlı ise kullanıcı bilgilerini gride yükle

                dgRecord.DataSource = service.GetUserInfo(txtUsername.Text.Trim(), txtPassword.Text);
            }
            else
            {
                MessageBox.Show("Kullanıcı Sistemde Kayıtlı Değil","Kullanıcı Bulunamadı",MessageBoxButtons.OKCancel,MessageBoxIcon.Warning);
            }
        }


Yukardaki kodları button nesnemizin click eventınada bağladıktan sonra projemizi "F5" tuşu ile çalıştırıp yaptığımız projeyi test edebiliriz.


Sistemde tanımlı olmayan murat isminde bir kullanıcı’yı sorguluyoruz.

Sistemde tanımlı olan kullanıcı adı : “bora” parolası : “123abc” olan bir kullanıcıyı sorguladığımızda bilgilerinin ekrana yüklendiğini görebilirsiniz.


Burada yaptığımız basit örneği geliştirerek sizde profesyonel Web Servis’ler yazıp bunları kendi projelerinizde veya sisteminize erişmek isteyen kullanıcıların hizmetine sunabilirsiniz.Umarım faydalı bir makele olmuştur herkese başarılar. 

14 yorum:

  1. Web servis yazma konusunda açıklayıcı bir makale olmuş .Teşekkürler

    YanıtlaSil
  2. çok güzel bir çalışma olmuş gayet faydalı emeğiniz için teşekkürler.

    YanıtlaSil
  3. Ben teşekkür ederim @fmdemir, faydalı olduysa ne mutlu bana ;)

    YanıtlaSil
  4. gerçekten basit ve güzel bir anlatım olmuşş

    YanıtlaSil
  5. * web servis yazmak için kesinlikle bir programlama dili kullanmak gerekiyor mu?
    PHP vb. gibi web kodu dili öğrenirsem, bunu onunla da yapabilir miyim; yani C# ya da VB.net kodu kullanmadan? Ben programcı değilim işin doğrusu, şu aralar Php üzerinde kendimi geliştirme fırsatım var fazlaca ve bu dilin web sayfası oluşturabilmesi kısmıyla ilgilenmiyorum; bir veritabanına yönelik yaptığı işler ilgilimi çekiyor. Örneğin web servisle bir yerden aldığı bir bilgiyi içeriye düzenli olarak insert-update eden ve tamamen PHP ve pl/sql ile hazırlanmış bir örnek gösterebilir misiniz çalışma alanınıza giriyorsa eğer. Çünkü asp.net üzerinden yaptığınız işlerde gördüğüm kodlar C# kodları, haliyle ben bir masaüstü programlama dili kullanılmış olarak görüyorum.

    - excel'den veri alıp DB'ye aktarma konusunda da yine programlama dili kullanılmış, bunda da aynı şart var mı, yani C# vb. bir masaüstü programlama dili kullanmak?

    Şöyle bir şeyi yapmak istiyorum mesela:
    A sistemindeki(örneğin merkez bankası kur fiyatları) x-y-z olarak tanımlanmış verileri oradaki hedef değerler her güncellendiğinde bizim sistemimize belirtilen yere insert eden bir web servis kodu örneği yapılabilir mi PHP ile; ve bu C# yada VB.net daha pratik mi olur?

    YanıtlaSil
  6. Salih merhaba, öncelikle Web servis yazmak için kesinlikle bir programlama dili kullanmak gerekiyor. Bununla ilgili detaylı açıklamayı "Web Servis Nedir Nerelerde Kullanılır ?" isimli makalemde yazmıştım. Web Servis kısacası web üzerinden HTTP protokolü ile hizmet veren program parçalarıdır, dolayısıyla bu program parçarını yazabilmek için bir programlama dili kullanmak gerekiyor. PHP dili ile de uğraşarak bir web servis (SOAP Servis) yazabilirsin. PHP dili ile veritabanı işlemleri'de yapabilirsin. C# tarafında yazdığım kodları ASP.Net yani web tarafında da kullanabilirsin. Excel'den veri alıp DB'ye ekleme konusunda da yaptığım örnek programlama dünyasında ihtiyaç duyulan bir olay sıkça karşılaşılan bir durum. Eğer dinamik olarak excel dosyalarından veri almak istiyorsan bir programlama dili kullanmak en mantıklı yöntem. Fakat excelden sürekli veri alma ihtiyacın yoksa programlama dili kullanmadan çeşitli database araçları yardımı ile DB'ye excel'den veri alabilirsin.

    Örneğine gelince ise, herhangi bir sistemden web servis yardımıyla veriler her değiştiğinde bunları alıp veritabanın da saklamak istiyorsan. Kullanacağın programlama dili ile belli sürelerle çalışan bir kod bloğu yazman gerek. Bu kod bloğu her çalıştığında senin verileri çekeceğin Web Servisi çağırıracak ve sende bu değerleri veritabanında saklayabilirsin.

    Öncelikle programlama dili olarak PHP kullandığın için sana çok fazla kod noktasında yardımcı olamıyorum, ama programlama dillerinde genel mantık aynıdır, sadece o mantığı kullandığın dil yardımıyla koda dökersin bu noktada benim örneklerimden faydalanabilirsin. PHP ile ilgili yine internette çok fazla döküman ve örnek kod bulabilirsin.

    Bu noktada daha yeni olduğun için sana tavsiyem internetten bolca örnek kod ve uygulamaları incelemen olacaktır, sana baya faydalı olacaktır, başarılar.

    YanıtlaSil
    Yanıtlar
    1. İlgin ve yardımların için teşekkür ederim. Bu blok çok faydalı konulara dokunduğu için daha ilk çalışmalarda gözle görülür işler çıkarmama yardımcı oldu. Heyecanınızın ve bu bilgilerin paylaşımının devamı dileğiyle..

      Sil
  7. Güzel bir yazı olmuş. Web Servisler ile ilgili bir bilgim yoktu temel olarak artık var.

    YanıtlaSil
  8. proje dosyasını da paylaşırsan daha zengin bir makale olur bence ;) ellerine sağlık.

    YanıtlaSil
  9. kendi arkadaşımın yazısına denk gelmek ne güzel, eline sağlık.

    YanıtlaSil
  10. anlatım çok güzel ellerinize sağlık. ben bir hata alıyorum hata mesajı olarak

    İlgili sözleşme için birden fazla bitiş noktası yapılandırması bulunduğundan 'ServiceReference1.ServiceSoap' sözleşmesi bitiş noktası yapılandırma bölümü yüklenemedi. Tercih edilen bitiş noktası yapılandırması bölümünü adıyla belirtin.

    iyi çalışmalar.

    YanıtlaSil
  11. sorunu çözdüm client app. içinde bulunan app.config de endpoint tagındaki conract kısmına tablo adını eklememiş onu ekleyince sorun düzeldi.

    YanıtlaSil
  12. Çok yararlı bir kaynak oldu benim için,çok teşekkür ederim.
    Ellerinize sağlık...

    YanıtlaSil
  13. çok teşekkürler web servis çalışması için

    YanıtlaSil