ASP.NET VirtualPathProvider Kullanimi

Can sıkıntısı saatlerine tekrar merhaba,ayağımız alışsın kampamyasına katılmayanlariniz yoktur , o sebeple güzel bir konu ile tekrar karşınızdayız , örnek üzerinden yürüttüğümüz örnek virtualPathProvider örneği olarak değerlendirilebilir,web sitelerinde görebileceğimiz ve proje gereği kullanilmasi gereken , fiziksel olarak dosyalarin saklanma yerinin bir veritabani oldugu durumlarda kullanılmaktadır.bu konuyu rewriteurl ile karıştırmamamız gerekir,o konuda en basitinden IIS üzerinde ayarlar yapilmasi gerekirken , burada sadece bir veritabani ve bir özel sinif yazimi söz konusu olmustur.

bir MSSQL Veritabani hazırlayarak işlemlerimize başlayalim :

create database VirtualPathDB

use VirtualPathDB

create table tblSanalSayfalar
(
DosyaID    int identity(1,1),
DosyaAdi nvarchar(200),
DosyaIcerik nvarchar(max)
)

create table tblOyuncular
(
OyuncuID int identity(1,1),
OyuncuAdi nvarchar(10),
OyuncuTakimi nvarchar(20)
)

hemen arkasindan , bu oyuncu tablosuna veri girişi yapabilirsiniz.Uygulamanin bu kısmını geçtikten sonra , sıra artik tblSanalSayfalar tablosuna veri girişi yapmaya geldi,ve bu şekilde fiziksel bir dosya kullanmak yerine , fiziksel dosyanın kodlarini veritabani üzerinde bulunan bir tabloda tutarak , sanal yol yaratma yoluna girmiş oluyoruz , nasipse çıkarız (:

tblSanalSayfalar tablosuna bir kayit ekliyoruz,bu kayitin görünümü aşağıdaki gibidir , ve DosyaIcerik kolonunda tutulan verilerde daha öncesinden yazdığım bir aspx dosyasının tüm içeriğidir , biraz üzerinde oynama yapmamiz gerekicektir , çünki veritabanindan çekilecek bir kod içeriği için , .aspx ile biten bir dosyanın Page direktifinde bu sayfanın hangi codefile ile çalıstığı bilgisi bulunmaktadir,biz tüm işlemleri gerek tasarim gerek C# olarak , InlineCoding yontemi ile sayfa içerisinde yapmamiz gerekir,Page direktifinden CodeFile ve Inherits bölümlerini siliyoruz,ve kolona kaydedilecek olan kodlar aşağıda görüldüğü gibi olmaktadir.

<%@ Page Language=”C#”%>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>Untitled Page</title>
<script runat=”server”>
protected void ButonTiklandi(object obj, EventArgs e)
{
System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection();
cn.ConnectionString = “data source=localhost;initial catalog=VirtualPathDB;integrated security=true”;
System.Data.SqlClient.SqlCommand cmd = cn.CreateCommand();
cmd.CommandText = “select * from tblOyuncular”;
System.Data.SqlClient.SqlDataAdapter da = new System.Data.SqlClient.SqlDataAdapter(cmd);

System.Data.DataTable dt = new System.Data.DataTable();
da.Fill(dt);

oyuncuGrid.DataSource = dt;
oyuncuGrid.DataBind();
}
</script>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>

Veritabanindan Gelen Verilerle Olusan Sayfa<br />
<asp:LinkButton ID=”lnkVeriGetir” runat=”server” OnClick=”ButonTiklandi”>Veri Getir</asp:LinkButton>
<br />
<br />
<asp:GridView ID=”oyuncuGrid” runat=”server” BackColor=”LightGoldenrodYellow”
BorderColor=”Tan” BorderWidth=”1px” CellPadding=”2″ ForeColor=”Black”
GridLines=”None”>
<FooterStyle BackColor=”Tan” />
<PagerStyle BackColor=”PaleGoldenrod” ForeColor=”DarkSlateBlue”
HorizontalAlign=”Center” />
<SelectedRowStyle BackColor=”DarkSlateBlue” ForeColor=”GhostWhite” />
<HeaderStyle BackColor=”Tan” Font-Bold=”True” />
<AlternatingRowStyle BackColor=”PaleGoldenrod” />
</asp:GridView>

</div>
</form>
</body>
</html>

yukaridaki kodlari kolona kaydederken , bosluklari kopyalarken dikkat etmenizi öneririm

VirtualPathDB

Bu adimi da geçtikten sonra , gelelim artik VirtualPathProvider kullanımına , bunun için App_Code klasörü içerisinde bir sınıf açiyoruz ve kodlarimiz şu şekildedir.

  1. using System.Data;
  2. using System.Web.Hosting;
  3. using System.IO;
  4. using System.Data.SqlClient;
  5.  
  6. public class CustomVirtualPathProvider : VirtualPathProvider
  7. {
  8. public static void AppInitialize()
  9. {
  10. CustomVirtualPathProvider c = new CustomVirtualPathProvider();
  11. HostingEnvironment.RegisterVirtualPathProvider(c);
  12. }
  13.  
  14. public string VeritabanindanDosyayiGetir(string _sanalSayfa)
  15. {
  16. string _sanal = string.Empty;
  17. string _dosya = _sanalSayfa.Substring(_sanalSayfa.IndexOf(‘/’,1) + 1);
  18.  
  19. SqlConnection cn = new SqlConnection();
  20. cn.ConnectionString = "data source=localhost;initial catalog=VirtualPathDB;integrated security=true";
  21. SqlCommand cmd = cn.CreateCommand();
  22. cmd.CommandText = "select DosyaIcerik from tblSanalSayfalar where DosyaAdi=@ad";
  23. cmd.Parameters.Add("@ad", SqlDbType.NVarChar).Value = _dosya;
  24.  
  25. cn.Open();
  26. object obj = cmd.ExecuteScalar();
  27. if (obj != null)
  28. _sanal = obj.ToString();
  29.  
  30. return _sanal;
  31. }
  32.  
  33. public override VirtualFile GetFile(string virtualPath)
  34. {
  35. string icerik = this.VeritabanindanDosyayiGetir(virtualPath);
  36. if (icerik == string.Empty)
  37. return Previous.GetFile(virtualPath);
  38. else
  39. return new CustomVirtualFile(virtualPath, icerik);
  40. }
  41.  
  42. public override bool FileExists(string virtualPath)
  43. {
  44. string icerik = this.VeritabanindanDosyayiGetir(virtualPath);
  45. if (icerik == string.Empty)
  46. return Previous.FileExists(virtualPath);
  47. else
  48. return true;
  49. }
  50. }
  51.  
  52. public class CustomVirtualFile : VirtualFile
  53. {
  54. string _DosyaIcerik;
  55.  
  56. public CustomVirtualFile(string _sanalSayfa,string _icerik):base(_sanalSayfa)
  57. {
  58. this._DosyaIcerik = _icerik;
  59. }
  60.  
  61. public override System.IO.Stream Open()
  62. {
  63. MemoryStream ms = new MemoryStream();
  64. StreamWriter sw = new StreamWriter(ms, System.Text.Encoding.Unicode);
  65.  
  66. sw.Write(_DosyaIcerik);
  67. sw.Flush();
  68. ms.Seek(0, SeekOrigin.Begin);
  69. return ms;
  70. }
  71. }

Default.aspx’imiz

Default.aspx

ve kodlari :

<%@ Page Language=”C#” AutoEventWireup=”true”  CodeFile=”Default.aspx.cs” Inherits=”_Default” %>

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>

<html xmlns=”http://www.w3.org/1999/xhtml”>
<head runat=”server”>
<title>AnaSayfa</title>
</head>
<body>
<form id=”form1″ runat=”server”>
<div>

Fiziksel Sayfamız : Default.aspx<br />
<br />
Sanal ( Virtual ) Sayfalar<br />
<a href=”SanalOyuncuSayfasi.aspx”>Oyuncu</a></div>
</form>
</body>
</html>

SanalOyuncuSayfasi.aspx’e tikladiğimizda,gelen sayfamiz :

Virtual Page

Virtual Page

ASP.NET Tek DataGrid’de 2 DataTable

Sayfa tasarimi :

Sayfa Tasarimi

Default.aspx.cs kodlarimiz

  1. using System;
  2. using System.Data;
  3. using System.Data.SqlClient;
  4.  
  5. public partial class _Default : System.Web.UI.Page
  6. {
  7. protected void Page_Load(object sender, EventArgs e)
  8. {
  9. this.TekGrid();
  10. }
  11.  
  12. void TekGrid()
  13. {
  14. string _connectionString = "data source=localhost;initial catalog=AdventureWorks;integrated security=true";
  15.  
  16. SqlConnection _cn1 = new SqlConnection(_connectionString);
  17. SqlConnection _cn2 = new SqlConnection(_connectionString);
  18.  
  19. SqlDataAdapter _adapter1 = new SqlDataAdapter("select ProductID,Name,ListPrice,SafetyStockLevel,Color,ProductSubcategoryID from Production.Product", _cn1);
  20. SqlDataAdapter _adapter2 = new SqlDataAdapter("select ProductSubcategoryID,Name from Production.ProductSubcategory", _cn2);
  21.  
  22. DataTable _dt1 = new DataTable();
  23. DataColumn[] _cl1 = new DataColumn[]
  24. {
  25. new DataColumn("ID",typeof(int))
  26. {
  27. AutoIncrement = true,
  28. Unique = true,
  29. AutoIncrementSeed = 1,
  30. AutoIncrementStep = 1
  31. },
  32. new DataColumn("Name",typeof(string)),
  33. new DataColumn("SurName",typeof(string))
  34. };
  35.  
  36. _dt1.Columns.AddRange(_cl1);
  37.  
  38. DataTable _dt2 = new DataTable();
  39. DataColumn[] _cl2 = new DataColumn[]
  40. {
  41. new DataColumn("ID",typeof(int))
  42. {
  43. AutoIncrement = true,
  44. Unique = true,
  45. AutoIncrementSeed = 1,
  46. AutoIncrementStep = 1
  47. },
  48. new DataColumn("Address",typeof(string)),
  49. new DataColumn("City",typeof(string))
  50. };
  51.  
  52. _dt2.Columns.AddRange(_cl2);
  53.  
  54. string[] _names = new string[]
  55. {
  56. "kenan","myfan","yourfan","irfan","coder","şimdi uzaklardasin"
  57. };
  58.  
  59. string[] _surNames = new string[]
  60. {
  61. "kalfa","dedikodu","liar","pinokyo"
  62. };
  63.  
  64. string[] _adresses = new string[]
  65. {
  66. "moda","yenidogan","tandogan","kordon","maslak"
  67. };
  68.  
  69. string[] _cities = new string[]
  70. {
  71. "istanbul","ankara","izmir"
  72. };
  73.  
  74. Random rnd = new Random();
  75. for (int i = 0; i &lt; 10; i++)
  76. {
  77. DataRow _row = _dt1.NewRow();
  78.  
  79. _row["Name"] = _names[rnd.Next(0, _names.Length)];
  80. _row["SurName"] = _surNames[rnd.Next(0, _surNames.Length)];
  81. _dt1.Rows.Add(_row);
  82. System.Threading.Thread.Sleep(10);
  83. }
  84.  
  85. for (int i = 0; i &lt; 10; i++)
  86. {
  87. DataRow _row = _dt2.NewRow();
  88.  
  89. _row["Address"] = _adresses[rnd.Next(0, _adresses.Length)];
  90. _row["City"] = _cities[rnd.Next(0, _cities.Length)];
  91. _dt2.Rows.Add(_row);
  92. System.Threading.Thread.Sleep(10);
  93. }
  94.  
  95. _dt1.PrimaryKey = new DataColumn[] { _dt1.Columns[0] };
  96. _dt2.PrimaryKey = new DataColumn[] { _dt2.Columns[0] };
  97.  
  98. _dt1.Merge(_dt2, false, MissingSchemaAction.AddWithKey);
  99.  
  100. myGrid.DataSource = _dt1;
  101. myGrid.DataBind();
  102. }
  103. }

Çıktı :

One Grid,Multi DataTable

ASP.NET Async IP Trace Tutorial

Can sıkıntısına , ilginç şeyler çıkmaya görsün , oturup yazdırıyor kendini (: , sağlik olsun.. Gelelim bu yazımızın girişine , ve neler yapacağimiza , IP , malumunuz tüm internete bağlı olan bilgisayarin ortak özelliklerinden bir tanesi ve herkes internet sağlayicisi ve çeşitli vasitalar ile dünyanın dört bir yanındaki diğer bilgisayarlara ( user , server ) bağlanabiliyor,bu işlem için her bilgisayar kendi IP’si ile yollar izleyerek istenilen hedefe ulasmaktadir,bu ulaşim boyunca birden cok durağı geçer.. Bizde bu yazımızda örnek bir IP adresi bilgisi üzerinden , o adrese uygulamamizin ulaşırken geçecek yollari listeleteceğiz , bilgisayarımızda bulunan tracert.exe ile bu işlem gerçekleştirilebilir fakat , network üzerinde yürüyen işlemler olduğundan güclü bağlantılar gerekmektedir , bu tür bir bağlantıyı da nedense güzel Türkiye’mde değilde ancak yunanistan teknik üniversitesinde bulabildim bu işlem için , sağolsunlar onların gençlerine açmişlar bu imkanlari …

Ilk önce bir Web Site açalim , ve Default.aspx dosyamızın tasarimini gördüğümüz gibi yapalim

Default.aspx Design

Default.aspx Design

Default.aspx dosyasının CodeFile’ında bulunan kodlarimizi paylaşalim,

  1. using System;
  2.  
  3. public partial class _Default : System.Web.UI.Page
  4. {
  5. protected void Page_Load(object sender, EventArgs e)
  6. {
  7. this.Title = "Trace Islemi";
  8. lnkTraceButton.PostBackUrl = "TraceResult.aspx";
  9. }
  10. }

Sıra geldi şimdi bizim için , TraceResult.aspx adini verdiğimiz , sonucları göreceğimiz ve işlemleri yaptiracağimiz olan asp.net sayfamıza , tasarimi aşağıda görüldüğü gibidir…

TraceResult.aspx design

TraceResult.aspx design

Bu sayfanın tasarimini tamamladiktan sonra, .cs dosyasının kodlarini paylaşalim

  1. using System;
  2. using System.Web.UI;
  3. using System.Web.UI.WebControls;
  4.  
  5. public partial class TraceResult : System.Web.UI.Page
  6. {
  7. Yonetim y;
  8. protected void Page_Load(object sender, EventArgs e)
  9. {
  10. this.Title = "Trace Islemi Sonuclari";
  11. if (PreviousPage != null)
  12. {
  13. TextBox txt = (TextBox)PreviousPage.FindControl("txtIPAdres");
  14. y = new Yonetim(txt.Text, this.plcKontrolHolder);
  15. PageAsyncTask task = new PageAsyncTask(y.Baslat, y.IslemBitir, null, null);
  16. Page.RegisterAsyncTask(task);
  17. }
  18. }
  19. protected void lnkTurnBack_Click(object sender, EventArgs e)
  20. {
  21. Response.Redirect("Default.aspx");
  22. }
  23. }

Islemleri yaptirdiğimiz ve nesne yönelimli mimari gereği , kullandığımı Yonetim sınıfımızın kodları :

  1. using System;
  2. using System.Web.UI.WebControls;
  3. using System.Collections.Generic;
  4. using System.Net;
  5. using System.IO;
  6.  
  7. public class Yonetim
  8. {
  9. public List&lt;string&gt; _IPYollari { get;set;}
  10. public string _IP {get;set;}
  11. Action _action;
  12. PlaceHolder _holder;
  13.  
  14. public Yonetim (string ip,PlaceHolder holder)
  15. {
  16. _IPYollari = new List&lt;string&gt;();
  17. this._IP = ip;
  18. _action = new Action(Islem);
  19. _holder = holder;
  20. }
  21.  
  22. public IAsyncResult Baslat(object sender, EventArgs e, AsyncCallback callBack, object state)
  23. {
  24. return _action.BeginInvoke(callBack, state);
  25. }
  26. void Islem()
  27. {
  28. _IPYollari.Clear();
  29. string _pageContent = string.Empty;
  30. try
  31. {
  32. WebRequest _request = WebRequest.Create(string.Format("http://www.ntua.gr/cgi-bin/rtracert?name={0}", this._IP));
  33. WebResponse _response = _request.GetResponse();
  34.  
  35. Stream _stream = _response.GetResponseStream();
  36. StreamReader _reader = new StreamReader(_stream);
  37.  
  38. _pageContent = _reader.ReadToEnd();
  39. if (_pageContent.Length &lt; 1)
  40. return;
  41. }
  42. catch
  43. {
  44. return;
  45. }
  46. string icMetin = string.Empty;
  47. string metin = string.Empty;
  48.  
  49. for (int i = 0; i &lt; _pageContent.Length - 4; i++)
  50. {
  51. metin += _pageContent[i]; // &lt;
  52. metin += _pageContent[i + 1]; // p
  53. metin += _pageContent[i + 2]; // r
  54. metin += _pageContent[i + 3]; // e
  55. metin += _pageContent[i + 4]; // &gt;
  56.  
  57. if (metin == "&lt;pre&gt;")
  58. {
  59. for (int k = i + 5; k &lt; _pageContent.Length; k++)
  60. {
  61. if ((_pageContent[k].ToString() + _pageContent[k + 1].ToString() + _pageContent[k + 2].ToString() + _pageContent[k + 3].ToString() + _pageContent[k + 4].ToString() + _pageContent[k + 5].ToString()) == "&lt;/pre&gt;")
  62. {
  63. break;
  64. }
  65. else
  66. icMetin += _pageContent[k];
  67. }
  68. // veriler alindi
  69. break;
  70. }
  71. else
  72. {
  73. metin = string.Empty;
  74. }
  75. }
  76.  
  77. for (int i = 0; i &lt; icMetin.Length; i++)
  78. {
  79. if (char.IsNumber(icMetin[i]) &amp;&amp; (icMetin[i + 1].ToString() + icMetin[i + 2].ToString()) == "  ")
  80. {
  81. string adres = string.Empty;
  82. for (int k = i + 3; ; k++)
  83. {
  84. if (icMetin[k].ToString() != " ")
  85. adres += icMetin[k].ToString();
  86. else
  87. break;
  88. }
  89. _IPYollari.Add(adres);
  90. }
  91. }
  92.  
  93. if (this._IPYollari.Count &gt; 0)
  94. {
  95. ListBox lst = new ListBox();
  96. lst.Height = 500;
  97. foreach (string item in this._IPYollari)
  98. lst.Items.Add(new ListItem(item));
  99.  
  100. this._holder.Controls.Add(lst);
  101. }
  102. else
  103. {
  104. Label lbl = new Label();
  105. lbl.Text = "Sonuc Yok";
  106. this._holder.Controls.Add(lbl);
  107. }
  108. }
  109. public void IslemBitir(IAsyncResult ra)
  110. {
  111. _action.EndInvoke(ra);
  112. }
  113. }

tüm bu hazırlıkların sonunda , Default.aspx sayfamızı ziyaret edelim ve bu sayfadan örnek bir IP değerini , Trace işlemine koyalim :

IP Trace Starting

IP Trace Starting

Islem Sonuclari

Trace Results...

Trace Results...

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 &gt; 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 &gt;= @beginDateParam and s.SatisTarihi &lt;= @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

.NET Asenkron Sound Player Ornek

Sound Player Tutorial

Sound Player Tutorial

Basit bir windows uygulaması , System.Media kütüphanesi altindaki SoundPlayer sınıfının dosyalari çalma işlemi için tasarlandi , ve büyük wav dosyalarina karşında asenkron çalışmaktadır.

C# kodlarimiz :

  1. using System;
  2. using System.ComponentModel;
  3. using System.Windows.Forms;
  4.  
  5. namespace XSoundPlayer
  6. {
  7. public partial class Form1 : Form
  8. {
  9. string secilenDosya;
  10. public Form1()
  11. {
  12. InitializeComponent();
  13. }
  14.  
  15. private void btnGozAt_Click(object sender, EventArgs e)
  16. {
  17. OpenFileDialog dosyaPenceresi = new OpenFileDialog();
  18. dosyaPenceresi.InitialDirectory = "C:\\";
  19. dosyaPenceresi.Filter = "WAV Dosyalari | *.wav";
  20.  
  21. if (dosyaPenceresi.ShowDialog() == DialogResult.OK)
  22. {
  23. secilenDosya = dosyaPenceresi.FileName;
  24. lblDosya.Text = string.Format("Dosya : {0}", secilenDosya);
  25. }
  26. }
  27.  
  28. private void btnPlay_Click(object sender, EventArgs e)
  29. {
  30. if (secilenDosya != string.Empty)
  31. {
  32. // player..
  33. System.Media.SoundPlayer player = new System.Media.SoundPlayer();
  34. // ses dosyasının fiziksel yolu
  35. player.SoundLocation = secilenDosya;
  36. // ses dosyasi yüklenmesi tamamlandiğinda tetiklenecek olay
  37. player.LoadCompleted += new AsyncCompletedEventHandler(player_LoadCompleted);
  38. // ses dosyası değiştiğinde tetiklenecek olay
  39. player.SoundLocationChanged += new EventHandler(player_SoundLocationChanged);
  40. // asenkron yükleme işleminin başlatilmasi ..
  41. player.LoadAsync();
  42. }
  43. }
  44.  
  45. void player_SoundLocationChanged(object sender, EventArgs e)
  46. {
  47. System.Media.SoundPlayer p = (System.Media.SoundPlayer)sender;
  48. p.LoadAsync();
  49. }
  50.  
  51. void player_LoadCompleted(object sender, AsyncCompletedEventArgs e)
  52. {
  53. System.Media.SoundPlayer p = (System.Media.SoundPlayer)sender;
  54. p.Play();
  55. }
  56. }
  57. }