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…
-
using System;
-
using System.Data.SqlClient;
-
using System.Data;
-
-
namespace HttpRaporXHandler
-
{
-
public class RaporHandler : System.Web.IHttpHandler
-
{
-
#region IHttpHandler Members
-
-
public bool IsReusable
-
{
-
get { return false; }
-
}
-
-
public void ProcessRequest(System.Web.HttpContext context)
-
{
-
context.Response.ContentType = "text/xml";
-
// gelen querystring’ler …
-
if (context.Request.QueryString.Count > 0)
-
{
-
// bu noktada gelen değerleri kontrol ettirebilirsiniz
-
// try – catch bloklari ile , ama bunu size birakiyorum …
-
string _productIDCriteria = context.Request.QueryString[0]; // id kriteri sorgu katari
-
string _beginningTime = context.Request.QueryString[1]; // baslangic zaman bilgisi sorgu katari
-
string _endingTime = context.Request.QueryString[2]; // bitiş zaman sorgu katari
-
-
string _connectionString = "data source=localhost;initial catalog=Triology;integrated security=true";
-
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");
-
-
// tarih formati : 25.12.2007 şeklinde gonderilir.
-
string[] beginParse = _beginningTime.Split(‘.’);
-
DateTime beginDate = new DateTime(int.Parse(beginParse[2]), int.Parse(beginParse[1]), int.Parse(beginParse[0]));
-
-
string[] endParse = _endingTime.Split(‘.’);
-
DateTime endDate = new DateTime(int.Parse(endParse[2]), int.Parse(endParse[1]), int.Parse(endParse[0]));
-
-
-
// parameters…
-
_command.Parameters.Add("@idParam", System.Data.SqlDbType.Int).Value = int.Parse(_productIDCriteria);
-
_command.Parameters.Add("@beginDateParam", System.Data.SqlDbType.SmallDateTime).Value = beginDate;
-
_command.Parameters.Add("endDateParam", System.Data.SqlDbType.SmallDateTime).Value = endDate;
-
-
-
_adapter.Fill(_dtTable);
-
-
// DataTable verilerini ekrana yansıtırken , Şemasi ile birlikte
-
// yazdırıyoruz,çünki başka bir uygulamanin , nesnesi okumak isterken , şema ihtiyaci
-
// duyar
-
_dtTable.WriteXml(context.Response.OutputStream,XmlWriteMode.WriteSchema);
-
}
-
}
-
-
#endregion
-
}
-
}
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ı
-
using System;
-
using System.Data;
-
using System.Windows.Forms;
-
using System.Net;
-
using System.IO;
-
-
namespace WindowsClientApp
-
{
-
public partial class Form1 : Form
-
{
-
public Form1()
-
{
-
InitializeComponent();
-
}
-
-
private void btnGetData_Click(object sender, EventArgs e)
-
{
-
// WebRequest ile bir sayfa talebine hazırlaniliyor…
-
WebRequest _request = WebRequest.Create(string.Format("http://localhost/WebRaporHandler/Rapor.raporx?P1={0}&P2={1}&P3={2}",txtProductID.Text, dateFirst.Value.ToShortDateString(), dateSecond.Value.ToShortDateString()));
-
-
// WebResponse ile de , talep den dönen cevabı inceliyoruz..
-
WebResponse _response = _request.GetResponse();
-
// cevapın sahip olduğu verileri Stream olarak ele aliyoruz.
-
Stream st = _response.GetResponseStream();
-
// Bu Stream’i , bir StreamReader tipinden okuyucuya teslim ediyoruz.
-
// okuyucunun baştan sona kadar okumasini istiyoruz..
-
string content = reader.ReadToEnd();
-
-
// hemen arka planda gelen içerik için bir XML Dosyası oluşturulmasini talep ediyoruz.
-
// olusturulduktan sonra filestream kapatilmalidir , ki başka stream’ler erişim
-
// yaptiginda programda istisnai durum oluşmasin.
-
fs.Close();
-
-
// Gelen Icerik içerisinde , \r\n gibi , text dosyalardan veri okumada da göreceğimiz
-
// kaçış karakterlerini kaldırıyoruz, sebebide bu karakterler bir XML dosya bünyesinde
-
// yer alamazlar…
-
content = content.Replace("\r\n", "");
-
// tüm XML gelen veri içeriğinide dosyamıza yazdırıyoruz…
-
// DataTable ile verileri XML formatinda olduğundan
-
// ve DataTable tiplerin XML dosyalari okuma yeteneği olduğundan
-
// verileri çekelim
-
dt.ReadXml("temp.xml");
-
// verileri çekmiş DataTable nesnemizi de Grid kontrolümüze
-
// veri kaynağı olarak gösteriyoruz.
-
_grid.DataSource = dt;
-
}
-
}
-
}
Ekran görüntüsü …

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

ASPNetOutput