Makale Özeti

Önce ki paylaşımlarımda XMLHttp ve XMLHttpRequest ActiveX objelerinden bahsetmiştim. Bu paylaşımım da da AJAX yolundan devam ederek Sys.Net.WebRequest nesnesinden bahsetmek istiyorum.

Makale

Merhaba Arkadaşlar,

Önce ki paylaşımlarımda XMLHttp ve XMLHttpRequest ActiveX objelerinden bahsetmiştim. Bu gün yine AJAX yolundan devam ederek Sys.Net.WebRequest nesnesinden bahsetmek istiyorum. Sys.Net.WebRequest nesnesi, VS içerisinde bulunan "AJAX Extensions" ların bir parçasıdır ve sayfalarımızdan Http talepleri başlatmamıza olanak verir. Microsoft AJAX Library'ye browser bağımsız asenkron iletişim desteği sağlar (Alıntı: Advanced ASP.NET AJAX Server Control For .NET Framework 3.5 - Adam Calderon,Joel Rumerman). O halde isterseniz gelin fazla zaman harcamadan bu sınıfın property ve metodlarına bir göz atalım.

Özellikler (Properties)
body - get, set : Talep için kullanılacak olan body (post talepleri için),
executor - get, set : Talep hakkında bazı bilgilere ulaşmamızı sağlayan özellik,
headers - get : Talebe ait Http header bilgileri,
httpVerb - get, set : Http talebinin türü (GET,SET, HEAD vb.) ,
timeout - get, set : Talebe ait zaman aşımı süresi,
url - get, set : Talebin başlatılacağı url bilgisi,
userContext - get, set : Talebe ait kullanıcı konteksti

Metodlar
add_complated : WebRequest nesnesinin server'dan gelecek olan bilgileri alabilmesi için bir "complated" metodu eklememizi sağlar,
complated : WebRequest nesnesinin "add_complated" metodu ile atanmış olan ve server'dan gelen bilgileri işlemek için kullanılacak "complated" metodu.
getResolveUrl : Talebe ait tam url'i verir,
invoke : Talebin başlatılması için kullanılır,
remove_complated : WebRequest nesnesine eklenmiş olan "complated" event handler'ını nesneden silmek için kullanılır.

Her bir metodun ve özelliğin ayrıntısına girmek istersek çok ciddi uzunlukta bir yazı ortaya çıkacak. Bir de bu yazının sonuna örnek uygulama eklendiğinde okunması zahmetli bir paylaşım olacak. O halde yukarı da ki property ve metodları bir örnek içerisinde kullanalım ve kuru sözlerin yerini pratiğe bırakalım.

Burada ilk iki makalemde kullandığım basit örneği tekrar kullanmak istiyorum. Çok basit olduğu için çokta pratik geliyor bana. Karmaşadan uzak bir örnek. Örnek içerisinde ele alacağımız durumu burada yeniden tekrar etmemiz gerekirse; Personele ait ad ve soyad bilgilerini alarak bir url'e "GET" talebi başlatacağız ve sonucunda personele ait telefon bilgisini alacağız. Örneğin çok basit olduğunun farkındayım(makalelerimi takip edenlere artık çok basit gelecektir). İlerleyen makalelerimde sizlerle gerçek hayatın içinden bir durumu ele alıyor olacağız. İnanıyorum ki çok eğleneceksiniz. Kullanacağımız örnek için diğer makalelerimi yeniden inceleme zahmetinden sizleri kurtarmak için talebi başlatacağımız "EmailBul.aspx" isimli sayfaya ait html içeriği aşağıda yeniden veriyorum. Örnekte kullanacağımız "DataPage.aspx" isimli sayfanın page direktifi dışında tüm içeriğini silmemiz gerektiğini unutmayalım. Eğer bu örneği yeniden yapmak istemiyor yada buna ayıracak zamanınız yoksa ilgili kodları yazının sonunda indirebilirsiniz. Buna rağmen hiç değilse yeni karşılaştığımız WebRequest sınıfı ile ilgili kod kısınlarını kendiniz uygulamaya çalışırsanız büyük faydası olacaktır.

Server'a HTTP GET talebi başlatmak için kullanacağımız "EmailBul.aspx" isimli sayfamızın html tag'leri aşağıda ki gibidir.

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<table border="0px" style="width:100%;">
    <tr>
        <td style="width: 10%;">
            Adı :
        </td>
        <td>
            <input id="txtAdi" name="txtAdi" type="text" />
        </td>
    </tr>
    <tr>
        <td style="width: 10%;">
            Soyadı : 
        </td>
        <td>
            <input id="txtSoyadi" name="txtSoyadi" type="text" />
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <input id="btnSorgula" type="button"value="Mail Adresini Getir" onclick="startRequest()" />
        </td>
    </tr>
    <tr>
        <td colspan="2">
            <div id="divSonuc" ></div>
        </td>
    </tr>
</table>

Yukarı da verdiğim tag'leri page'imize uyguladıktan sonra talebimizi başlatmak için kullanacağımız "startRequest()" isimli javascript metodumuzu yazmaya başlayabiliriz. Bundan önce, WebRequest sınıfını kullanabilmemiz için sayfamızın en üst kısmına, tüm kontrollerden önce "AJAX Extensions" içerisinde bulunan "ScriptManager" objesini eklemeliyiz.

   1:  <script language="javascript" type="text/javascript">
   2:      function startRequest() {
   3:          var divSonuc = $get("divSonuc");
   4:          var queryString = "ad=" + encodeURIComponent($get("txtAdi").value) + 
   5:                                     "&soyad=" + encodeURIComponent($get("txtSoyadi").value);
   6:          
   7:          var webRequest = new Sys.Net.WebRequest();
   8:          webRequest.set_httpVerb("GET");
   9:          webRequest.set_url("DataPage.aspx?" + queryString);
  10:          webRequest.add_completed(
  11:              function(executor, args) {
  12:                  if (executor.get_responseAvailable()) {
  13:                      divSonuc.innerHTML = "Personel E-Posta Adresi: " + executor.get_responseData();
  14:                  }
  15:                  // Gelen status kodlarına göre özel işlemler burada yapılabilir.
  16:              }
  17:          );
  18:   
  19:          webRequest.invoke();
  20:      }
  21:  </script>

Farkettiniz mi bilmiyorum ancak gördüğünüz gibi WebRequest sınıfını direk olarak kullandık. Browser tarafından desteklenip desteklenmediğini kontrol etmedik. Nedeni ise bu nesnemizin tüm browser'lar da çalışabiliyor olmasıdır. Böylece zahmetli bir işten de kurtulmuş olduk. Bu açıklamadan sonra isterseniz gelin bir de server-side kodlarımıza bakalım ve burada ne yaptığımızı yeniden hatırlayalım.

   1:  protected void Page_Load(object sender, EventArgs e)
   2:  {
   3:      Response.ContentType = "text/Plain";
   4:   
   5:      string ad = Request.QueryString["ad"].ToString();
   6:      string soyad = Request.QueryString["soyad"].ToString();
   7:   
   8:      SqlConnection connection = null;
   9:      SqlCommand command = null;
  10:   
  11:      try
  12:      {
  13:          connection = new SqlConnection("server=TOLGA-PC\\TOLGAAYKURRT;database=AdventureWorks;integrated security=SSPI");
  14:          command = new SqlCommand("select EmailAddress from Person.Contact where FirstName=@ad and LastName=@soyad", connection);
  15:   
  16:          command.Parameters.AddWithValue("@ad", ad);
  17:          command.Parameters.AddWithValue("@soyad", soyad);
  18:   
  19:          connection.Open();
  20:          Object email = command.ExecuteScalar();
  21:          connection.Close();
  22:   
  23:          if (email != null && email != DBNull.Value)
  24:          {
  25:              Page.Response.Write(Convert.ToString(email));
  26:          }
  27:          else
  28:          {
  29:              Page.Response.Write("<font color='Red'>Mail adresi bulunamadı!!!</font>");
  30:          }
  31:      }
  32:      catch (Exception ex)
  33:      {
  34:          Page.Response.Write(ex.Message);
  35:      }
  36:      finally
  37:      {
  38:          if (connection != null)
  39:          {
  40:              if (connection.State != System.Data.ConnectionState.Closed) connection.Close();
  41:              connection.Dispose();
  42:              connection = null;
  43:          }
  44:   
  45:          if (command != null)
  46:          {
  47:              command.Dispose();
  48:              command = null;
  49:          }
  50:      }
  51:  }

XMLHttp nesnesi ile ilgili diğer yazdığım makalerlerden de hatırlayacağınız gibi server tarafında tek yapmamız gereken querystring'leri almak ve veritabanı sorgumuz için uygun query'yi oluşturmak. Daha sonra elde ettiğimiz sonuçları "Response.Write()" metodu yardımıyla client'a göndermek. İşte bu kadar basit ve kolay.

Burada sanırım bir şey dikkatinizi çekmiştir; WebRequest nesnesi için kullandığımız metodlar ve property'ler, XMLHttp nesnesi ile büyük benzerlik taşımaktadır. Kesinlikle doğru. WebRequest nesnesi XMLHttp ActiveX objesinin sarmalayıcısıdır. Yani aslında arka planda yine XMLHttp nesnesi kullanılmaktadır. Ancak WebRequest nesnesi ile browser sorunlarını düşünmek zorunda olmayışımız büyük avantajdır. Bununla beraber WebRequest nesnesinin sarmalayıcı olmasından kaynaklanan doğal sonuç olarak XMLHttp nesnesinin domain dışına request yapamama dezavantajı burada da varlığını sürdürmektedir.

Selamlar,

tolga[et]tolga-aykurt[nokta]com

 

 

Örnek Uygulama Ait Kaynak Kodlar