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

Leave a Reply

You must be logged in to post a comment.