ASP.NET HttpHandler,WinClient Form,WebService Base

Guzel bir uygulama ile tekrar karşinizdayim , ama bildiğiniz derste takiliyorum , o ayrı tabi,
Bu yazımıdaki uygulamamiz aşamali olduğundan şimdiden sıkılacak arkadaşlar var ise , haberturk’ün

foto galerilerinde gezmelerini tavsiye edebilirim ,sağlik olsun diyoruz biliyorsunuz ki böyle durumlar için,uygulama temel olarak ASP.NET içerisinde HttpHandler,Windows tarafinda cok yogun kullandığımız WebRequest türünden tipler üzerine inşaa edilecektir,kısaca açiklayacak olursam , bir Windows uygulamasi ,arka planında , arayüzden bizden aldiği değerlere göre , web sayfasina talep yapmakta ve bu talep karşısında,kendisine XML veriler döndürülmektedir.Bu xml verileri DataTable vasitasi ile okuyup , DataGridView kontrolü içerisinde sunuyoruz.Ekran görüntüleri , ve açiklamali kodlarimiz ile sizleri başbaşa bırakıyorum.

Öncelikli olarak bir Veritabanina ihtiyacimiz var , bunun için Sql Script’i sizlerle paylaşiyorum.

create database TriologyDB
use TriologyDB
create table tblUrun
(
UrunID int identity(1,1),
UrunAdi nvarchar(100),
)

create table tblSatis
(
SatisID int identity(1,1),
SatisUrunID int,
SatisTarihi smalldatetime,
SatisAdet int
)

bu DB ve tablolar olusturulduktan sonra, ben yazımızda örnek amacli olarak AdventureWorks veritabaninin Production.Product tablosundan ürün isimlerini tblUrun tablomuza aktardim , tabi hepsini değil..tblSatis tablosunda da , 1000 adet rastgele kayit girişinde bulundum , bu tabloya rastgele urun kimlik bilgisine göre , ve rastgele tarihlere göre kayitlar girdirerek , zaman içerisinde belli adetlerde satış yapıldığına dair simulasyon gerçekleştiriyoruz, gerçek uygulamanizda tabiki böyle bir şeye gerek olmayacaktır,kendi veri tablolarinizda örneğimizdekinden cok cok farklı olacaktir. Veritabani ihtiyacimizi karşıladığımıza göre , sıra geldi adım adım ilerlemeye , bu yürüyüşümüzün ilk adimi olarak HttpHandler tasarimina gireceğiz, HttpHandler’lar ASP.NET içerisinde uzantısına göre işleri devir alan tiplerdir ve HTML çıktı üretmekle yükümlüdürler.Biz Kendi uzantimiz için kendi HttpHandler’imizi yazarken .raporx uzantili olacağı şeklinde bir senaryo düşünmekteyiz.

.raporx ile biten sayfalarimiza talepler ve peşinden gelecek olan QueryString ( sorgu katari ) bilgileri ileXML çıktılar üreteceğiz, tabiki de bunun için yukarıda hazırlanmış olduğunu düşündüğüm ( hazırladığım ) veritabaninin bilgilerinden yararlanacağız.Bu kadar teoriden sonra gelelim bir HttpHandler yazılmasına, bu işlem için bir ClassLibrary Project düşünüyoruz, ki derleme işlemi sonunda bizim için bir Assembly(dll) üretilmiş olsun.HttpHandler ‘larin ortak noktası , System.Web assembly’si içerisinde bulunan IHttpHandler arayüzlerini tiplere uygulanmış olmasıdır.

Açtığımız ClassLibrary’deki class’imiza bu arayüzü uyguluyoruz ve kodlarimiz…

  1. using System;
  2. using System.Data.SqlClient;
  3. using System.Data;
  4.  
  5. namespace HttpRaporXHandler
  6. {
  7. public class RaporHandler : System.Web.IHttpHandler
  8. {
  9. #region IHttpHandler Members
  10.  
  11. public bool IsReusable
  12. {
  13. get { return false; }
  14. }
  15.  
  16. public void ProcessRequest(System.Web.HttpContext context)
  17. {
  18. context.Response.ContentType = "text/xml";
  19. // gelen querystring’ler …
  20. if (context.Request.QueryString.Count > 0)
  21. {
  22. // bu noktada gelen değerleri kontrol ettirebilirsiniz
  23. // try – catch bloklari ile , ama bunu size birakiyorum …
  24. string _productIDCriteria = context.Request.QueryString[0]; // id kriteri sorgu katari
  25. string _beginningTime = context.Request.QueryString[1]; // baslangic zaman bilgisi sorgu katari
  26. string _endingTime = context.Request.QueryString[2]; // bitiş zaman sorgu katari
  27.  
  28. string _connectionString = "data source=localhost;initial catalog=Triology;integrated security=true";
  29. string _commandText = string.Format("select u.UrunAdi,SUM(s.SatisAdet) as ‘SatisAdet’ from tblUrun u inner join tblSatis s on u.UrunID = s.SatisUrunID where s.SatisTarihi >= @beginDateParam and s.SatisTarihi <= @endDateParam and u.UrunID = @idParam group by u.UrunAdi order by 2 DESC");
  30.  
  31. // tarih formati : 25.12.2007 şeklinde gonderilir.
  32. string[] beginParse = _beginningTime.Split(‘.’);
  33. DateTime beginDate = new DateTime(int.Parse(beginParse[2]), int.Parse(beginParse[1]), int.Parse(beginParse[0]));
  34.  
  35. string[] endParse = _endingTime.Split(‘.’);
  36. DateTime endDate = new DateTime(int.Parse(endParse[2]), int.Parse(endParse[1]), int.Parse(endParse[0]));
  37.  
  38. SqlConnection _connection = new SqlConnection(_connectionString);
  39. SqlCommand _command = new SqlCommand(_commandText, _connection);
  40.  
  41. // parameters…
  42. _command.Parameters.Add("@idParam", System.Data.SqlDbType.Int).Value = int.Parse(_productIDCriteria);
  43. _command.Parameters.Add("@beginDateParam", System.Data.SqlDbType.SmallDateTime).Value = beginDate;
  44. _command.Parameters.Add("endDateParam", System.Data.SqlDbType.SmallDateTime).Value = endDate;
  45.  
  46. SqlDataAdapter _adapter = new SqlDataAdapter(_command);
  47. DataTable _dtTable = new DataTable("Results");
  48.  
  49. _adapter.Fill(_dtTable);
  50.  
  51. // DataTable verilerini ekrana yansıtırken , Şemasi ile birlikte
  52. // yazdırıyoruz,çünki başka bir uygulamanin , nesnesi okumak isterken , şema ihtiyaci
  53. // duyar
  54. _dtTable.WriteXml(context.Response.OutputStream,XmlWriteMode.WriteSchema);
  55. }
  56. }
  57.  
  58. #endregion
  59. }
  60. }

Kodlarimizi derlediğimizde bizim için bir DLL oluşmasi gerekir,bu DLL dosyası da Kod dosyasının yanında bulunan Bin/Debug klasörü içerisindedir.

Şimdi bir WebSite açalim , ve peşinden web site projesi üzerine sağ tıklama ile Add Reference diyelim,bu noktadan sonra , DLL dosyamızı bulup Referans ettiğimizi gösterelim

Referans edilen assembly’nin tanitilmasi işlemlerine geçtiğimizde ilk olarak web sitemizin web.config dosyasını açıp httpHandlers düğümünü buluyoruz.Bu düğüm içine kendi handlerimizi ve hangi uzantı için çalışacağını söylemeliyiz.

web.config içerisindeki kodlarimiz…

<httpHandlers>
<remove verb=”*” path=”*.asmx”/>
<add verb=”*” path=”*.asmx” validate=”false” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>
<add verb=”*” path=”*_AppService.axd” validate=”false” type=”System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″/>
<add verb=”GET,HEAD” path=”ScriptResource.axd” type=”System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35″ validate=”false”/>
<!–
BİZİM HANDLERİMİZ
–>
<add verb=”*” path=”*.raporx” type=”HttpRaporXHandler.RaporHandler,HttpRaporXHandler” validate=”false”/>
</httpHandlers>

type kısmında açtiğimiz ClassLibrary’nin Namespace’i ve (.) dan sonrasi ile de yazdığımız HttpHandler tipini söylemekteyiz.

path parametresinde de hangi uzantili dosyalarin ele alinacağı anlatilmaktadir.

Şimdi sıra, bu handler’in IIS tarafindan taninmasi ,bunun için Bilgisayarim > Yonet > IIS Service , Web sitemizi bulalim ve özelliklerine geçelim , Yapılandırma bölümünden ekle dediğimizde

gelecek olacak pencerede GözAt butonunun karşısında olan kısma aspnet_isapi.dll ‘i buluyoruz, yerini gösteriyoruz,path kısmında da .raporx dedikten sonra , pencerenin sol altinda bulunan , dosyalarin fiziksel olarak varliğini kontrol et seçeneğini iptal ediyoruz,işlem bu kadar…

Gelelim Artik , bu Web sitesi üzerinden , bizim belirlediğimiz uzantı ile veri çekme işlemini yapacak form uygulamasina , Form üzerinde 2 tane datetimepicker , bir textbox , button ,ve datagridview bulunmaktadır.

Form1.cs kodları

  1. using System;
  2. using System.Data;
  3. using System.Windows.Forms;
  4. using System.Net;
  5. using System.IO;
  6.  
  7. namespace WindowsClientApp
  8. {
  9. public partial class Form1 : Form
  10. {
  11. public Form1()
  12. {
  13. InitializeComponent();
  14. }
  15.  
  16. private void btnGetData_Click(object sender, EventArgs e)
  17. {
  18. // WebRequest ile bir sayfa talebine hazırlaniliyor…
  19. WebRequest _request = WebRequest.Create(string.Format("http://localhost/WebRaporHandler/Rapor.raporx?P1={0}&amp;P2={1}&amp;P3={2}",txtProductID.Text, dateFirst.Value.ToShortDateString(), dateSecond.Value.ToShortDateString()));
  20.  
  21. // WebResponse ile de , talep den dönen cevabı inceliyoruz..
  22. WebResponse _response = _request.GetResponse();
  23. // cevapın sahip olduğu verileri Stream olarak ele aliyoruz.
  24. Stream st = _response.GetResponseStream();
  25. // Bu Stream’i , bir StreamReader tipinden okuyucuya teslim ediyoruz.
  26. StreamReader reader = new StreamReader(st);
  27. // okuyucunun baştan sona kadar okumasini istiyoruz..
  28. string content = reader.ReadToEnd();
  29.  
  30. // hemen arka planda gelen içerik için bir XML Dosyası oluşturulmasini talep ediyoruz.
  31. FileStream fs = new FileStream("temp.xml", FileMode.Create);
  32. // olusturulduktan sonra filestream kapatilmalidir , ki başka stream’ler erişim
  33. // yaptiginda programda istisnai durum oluşmasin.
  34. fs.Close();
  35.  
  36. // Gelen Icerik içerisinde , \r\n gibi , text dosyalardan veri okumada da göreceğimiz
  37. // kaçış karakterlerini kaldırıyoruz, sebebide bu karakterler bir XML dosya bünyesinde
  38. // yer alamazlar…
  39. content = content.Replace("\r\n", "");
  40. // tüm XML gelen veri içeriğinide dosyamıza yazdırıyoruz…
  41. File.WriteAllLines("temp.xml", new string[] {  content });
  42. DataTable dt = new DataTable();
  43. // DataTable ile verileri XML formatinda olduğundan
  44. // ve DataTable tiplerin XML dosyalari okuma yeteneği olduğundan
  45. // verileri çekelim
  46. dt.ReadXml("temp.xml");
  47. // verileri çekmiş DataTable nesnemizi de Grid kontrolümüze
  48. // veri kaynağı olarak gösteriyoruz.
  49. _grid.DataSource = dt;
  50. }
  51. }
  52. }

Ekran görüntüsü …

WinClient App

WinClient App

Win Form’un arka planda , çektiği verinin web üzerinden çıktısı :

ASPNetOutput

ASPNetOutput

Leave a Reply

You must be logged in to post a comment.