UrlMappings di asp.net2.0 sangat mudah digunakan, tetapi sayangnya tidak mendukung ekspresi reguler. Namun, untungnya, jika Anda menggunakan IHttpModule,
apa pun jenis permintaannya, ia akan melalui IHttpModule terlebih dahulu, yang memberikan manfaat. peluang untuk menulis ulang URL. :
Berikut ini adalah IHttpModule yang saya tulis:
menggunakan System;
menggunakan System.Web;
kelas publik ReWriteModule:IHttpModule
{
Modul Penulisan Ulang publik()
{
}
string penggantian publik ToString()
{
kembalikan ini.GetType().ToString();
}
batalkan IHttpModule.Buang()
{
}
private static System.Xml.XmlDocument ruleDoc = null;
System.Xml.XmlDocument GetRuleConfig statis pribadi (aplikasi System.Web.HttpContext)
{
jika (ruleDoc == null)
{
ruleDoc = Sistem baru.Xml.XmlDocument();
ruleDoc.Load(app.Server.MapPath("~/rule.xml"));
}
kembalikan aturanDok;
}
string statis publik GetUrl(System.Web.HttpContext cxt, jalur string)
{
Sistem.Xml.XmlDocument doc = GetRuleConfig(cxt);
System.Xml.XmlNodeList lst= doc.GetElementsByTagName("RewriterRule");
tali tepuk="";
foreach (System.Xml.XmlNode dan di lst)
{
System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes;
foreach(System.Xml.XmlNode chk di sub)
{
pat = "^" + chk.InnerText+"$";
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase);
if(reg.IsMatch(jalur))
{
return reg.Replace(path, nd.ChildNodes[1].InnerText);
}
}
}
kembalikan nol;
}
void IHttpModule.Init (konteks Aplikasi Http)
{
konteks.BeginRequest += delegasi(pengirim objek, EventArgs e)
{
System.Web.HttpContext cxt = konteks.Konteks;
if (cxt.Request.ContentType != "gambar/pjpeg")
{
tipe string = cxt.Request.ContentType.ToLower();
string jalur = cxt.Permintaan.Jalur;
string apppath = cxt.Request.ApplicationPath;
jalur = jalur.Hapus(0, jalur aplikasi.Panjang);
jalur = "~" + jalur;
string newUrl = GetUrl(cxt, jalur.TrimEnd().TrimStart());
jika (Url baru!= null)
{
cxt.Response.Filter = ResponseFilter baru(cxt.Response.Filter,cxt.Request.Path);
cxt.Response.Write("Jalur yang diminta:" + jalur);
cxt.Respon.Write("<BR>");
cxt.Response.Write("URL tujuan yang dialihkan: " + newUrl);
cxt.Respon.Write("<BR>");
cxt.RewritePath(Url baru);
} // Digunakan jika diperlukan untuk menangani semua permintaan
//kalau tidak
//{
// cxt.Response.Write(cxt.Request.Path + "<BR>");
// cxt.Response.Write("Sumber daya yang Anda minta tidak ada atau Anda tidak memiliki izin untuk mengakses!");
// cxt.Respon.Flush();
// cxt.Respon.End();
//}
}
};
}
}
Karena setelah URL ditulis ulang, Tindakan dalam WEBFORM asli akan berubah, yang dapat dengan mudah menyebabkan: sumber daya yang diminta tidak ada
. Akan menjadi jelas jika Anda DX melihatnya! ! !
Yang kita punya hanyalah ResponseFilter ini, yang diimplementasikan sebagai berikut,
public class ResponseFilter:System.IO.Stream
{
Filter Respons publik(System.IO.Stream sink,string _str)
{
_tenggelam = tenggelam;
//
// TODO: tambahkan logika konstruktor di sini
//
ini.str = _str;
}
string pribadi str = "";
Sistem.IO.Stream _sink pribadi;
posisi _ panjang pribadi;
private System.Text.Encoding end=System.Text.Encoding.GetEncoding("GB18030");
Sistem.Teks.StringBuilder pribadi oOutput = Sistem.Teks.StringBuilder();
// Anggota Stream berikut harus diganti.
penggantian publik bool CanRead
{
dapatkan { kembalikan benar; }
}
penggantian publik bool CanSeek
{
dapatkan { kembalikan benar; }
}
penggantian publik bool CanWrite
{
dapatkan { kembalikan benar; }
}
public override yang panjang
{
dapatkan { kembali 0 ;
}
publik mengesampingkan Posisi panjang
{
dapatkan { kembalikan _posisi }
setel { _posisi = nilai }
}
public override long Seek (offset panjang, arah System.IO.SeekOrigin)
{
return _sink.Seek(offset, arah);
}
public override void SetLength(panjang panjang)
{
_sink.SetLength(panjang);
}
penggantian publik batal Tutup()
{
_tenggelam.Tutup();
}
penggantian publik void Flush()
{
_tenggelam.Siram();
}
public override int Read(byte[] buffer, int offset, int count)
{
return _sink.Read(buffer, offset, hitung);
}
// Metode Write sebenarnya melakukan pemfilteran.
public override void Write(byte[] buffer, int offset, int count)
{
string szBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
string ap="aksi="";
int pos=-1;
jika ((pos=szBuffer.IndexOf(ap) )!= -1)
{
int epos = szBuffer.IndexOf(""", pos + ap.Panjang+1);
jika (epos != -1)
{
szBuffer= szBuffer.Remove(pos + ap.Panjang, epos - pos - ap.Panjang);
}
szBuffer = szBuffer.Insert(pos + ap.Length, this.str);
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szBuffer);
_sink.Write(data, 0, data.Panjang);
}
kalau tidak
{
oOutput.Tambahkan(szBuffer);
}
//Paragraf berikut dapat digunakan untuk mengubah konten antara <Head></head>;
//Regex oEndFile = Regex baru("</head>", RegexOptions.IgnoreCase|RegexOptions.Compiled);
//jika (oEndFile.IsMatch(szBuffer))
//{
// //Tambahkan buffer data terakhir
// //Tambahkan bagian terakhir data di buffer
// oOutput.Tambahkan(szBuffer);
// //Dapatkan kembali respons lengkap untuk klien
// //Mengirimkan data pengembalian klien yang lengkap
// string szCompleteBuffer = oOutput.ToString().ToLower();
// int ipos = szCompleteBuffer.IndexOf("<judul>");
// int epos = szCompleteBuffer.IndexOf("</title>",ipos+7);
// string sp = szCompleteBuffer.Substring(ipos+7, epos - ipos );
// szCompleteBuffer = szCompleteBuffer.Hapus(ipos+7,sp.Panjang-7);
// szCompleteBuffer = szCompleteBuffer.Insert(ipos + 7, "dhz");
// // szCompleteBuffer = szCompleteBuffer.Replace(sp, "dhz");
// //Tidak ada kecocokan, jadi tuliskan data asli
// //Tidak ada kecocokan, jadi kode sumber ditulis
// byte[] data = Sistem.Teks.UTF8Encoding.UTF8.GetBytes(szCompleteBuffer);
// _sink.Write(data, 0, data.Panjang);
//}
//kalau tidak
//{
// oOutput.Tambahkan(szBuffer);
//}
}
}
//////Aturan menunggu dikonfigurasikan sebagai berikut menggunakan file xml
tentu saja, Anda juga dapat melakukannya melalui bagian konfigurasi khusus di web.config
<?xml version="1.0" coding="utf-8" ?>
<Aturan>
<Aturan Penulis Ulang>
<Pencarian>
<LookFor>~/(d{4})/(d{2}).html</LookFor>
<LookFor>~/(d{4})/(d{2})/</LookFor>
<Mencari>~/(d{4})/(d{2})</Mencari>
<LookFor>~/(d{4})/(d{2})/index.html</LookFor>
</Pencarian>
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo>
</Aturan Penulis Ulang>
<Aturan Penulis Ulang>
<Pencarian>
<Mencari>~/pc</Mencari>
</Pencarian>
<KirimKe>~/Test2.aspx</SendTo>
</Aturan Penulis Ulang>
</Aturan>
//Aturan ini tidak ditulis dengan baik. Misalnya, aturan pertama dapat dilakukan dengan ekspresi reguler. Tapi saya tidak tahu bagaimana menulisnya dengan benar saat ini. Sepertinya saya perlu menggunakan beberapa konsep kelompok anti-penangkapan. Saya sedang memikirkan hal ini! !