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.
-
using System.Data;
-
using System.Web.Hosting;
-
using System.IO;
-
using System.Data.SqlClient;
-
-
public class CustomVirtualPathProvider : VirtualPathProvider
-
{
-
public static void AppInitialize()
-
{
-
HostingEnvironment.RegisterVirtualPathProvider(c);
-
}
-
-
public string VeritabanindanDosyayiGetir(string _sanalSayfa)
-
{
-
string _sanal = string.Empty;
-
string _dosya = _sanalSayfa.Substring(_sanalSayfa.IndexOf(‘/’,1) + 1);
-
-
cn.ConnectionString = "data source=localhost;initial catalog=VirtualPathDB;integrated security=true";
-
SqlCommand cmd = cn.CreateCommand();
-
cmd.CommandText = "select DosyaIcerik from tblSanalSayfalar where DosyaAdi=@ad";
-
cmd.Parameters.Add("@ad", SqlDbType.NVarChar).Value = _dosya;
-
-
cn.Open();
-
object obj = cmd.ExecuteScalar();
-
if (obj != null)
-
_sanal = obj.ToString();
-
-
return _sanal;
-
}
-
-
public override VirtualFile GetFile(string virtualPath)
-
{
-
string icerik = this.VeritabanindanDosyayiGetir(virtualPath);
-
if (icerik == string.Empty)
-
return Previous.GetFile(virtualPath);
-
else
-
}
-
-
public override bool FileExists(string virtualPath)
-
{
-
string icerik = this.VeritabanindanDosyayiGetir(virtualPath);
-
if (icerik == string.Empty)
-
return Previous.FileExists(virtualPath);
-
else
-
return true;
-
}
-
}
-
-
public class CustomVirtualFile : VirtualFile
-
{
-
string _DosyaIcerik;
-
-
public CustomVirtualFile(string _sanalSayfa,string _icerik):base(_sanalSayfa)
-
{
-
this._DosyaIcerik = _icerik;
-
}
-
-
public override System.IO.Stream Open()
-
{
-
-
sw.Write(_DosyaIcerik);
-
sw.Flush();
-
ms.Seek(0, SeekOrigin.Begin);
-
return ms;
-
}
-
}
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








