Bazen bir aspx sayfasının çıktısı üzerinde işlemler yapmak isteyebilirisiniz. Örneğin sayfadaki yasaklı kelimelerin - genelde forumlarda ihtiyaç duyulur :) - düzenlenmesi, ya da bazı bilindik kelimeler üzerinde işlem yapmak isteyebiliriz. Mesela ben sayfamda BT Akademi ve oğuz kelimelerine rastladığımda ilgili kelimelerin yerine sanki linki verilmiş gibi yer almasını isteyebilirim. Bu durumda yapmamız gereken çıktının - Response -
Filter özelliğinden yararlanmak. Filter özelliğini - property- incelediğimizde aslında bunun bir Stream nesnesi olduğunu görürüz. Bu durumda yapmamız gereken görüntülenmesini istediğimiz çıktıyı kendimiz oluşturmak. Bunu da kendi Filter - aslında Stream'dan türemiş bir class oluşturmak - nesnemizi oluşturup Response.Filter özelliğine bu kendi nesnemizi vermekten ibaret.
Stream sınıfı abstract bir class olduğundan abstract - özet kelimesini pek sevmesem de Türkçe'de başka kelime anlamını tam veremiyor- olarak bildirilmiş metodlarını kendi sınıfımızda uygulamamız - implement - gerekiyor. Bunları ekteki dosyadan inceleyebilirsiniz. Asıl üzerinde durulması gereken konu ise bu oluşturduğumuz sınıfın
Write(...) metodu. Bu metod içinde sayfamızda görünmesini istediğimiz çıktıyı kendimizin oluşturması. Örneğimizi incelersek
class AFilter:Stream
{
Stream _originalStream = null;
public AFilter(Stream ResponseFilter)
{
_originalStream = ResponseFilter;
}
...........
...........
public override void Write(byte[] buffer, int offset, int count)
{
string text = Encoding.UTF8.GetString(buffer);
//Regex de kullanılabilir...
text = text.Replace("oğuz", "<a href=http://www.oguzyagmur.com>oguz</a>");
text = text.Replace("BT Akademi", "<a href=http://www.btakademi.com>BT Akademi</a>");
// istenilen ek işlemler yapılabilir.
text = text.Replace("\r\n", "");
//eklemeler yapılabilir cıktıya...
text += "<br>tüm hakkı saklı falan değildir. tepe tepe kullanın";
buffer = Encoding.UTF8.GetBytes(text);
_originalStream.Write(buffer, 0, buffer.Length);
}
}
Write metodunda sayfaya çıktı gönderilmeden önce çıktıyı alıp üzerinden işlemler yapıp daha sonra çıktıyı sayfaya gönderiyorum. Bu sınıf oluşturdukdan sonra yapmamız gereken sayfanın OnPreInit metodunda hazırlamış olduğumuz bu filitrenin sayfa çıktısı üzerine uygulanmasını sağlamak.
protected override void OnPreInit(EventArgs e)
{
Response.Filter = new AFilter(Response.Filter);
}
Bu durumda sitedeki her sayfa için bu işlemi tekrarlamak olacaktır ki çok da iyi bir yöntem değil. Belki
MyCustomPage isimli Page den türemiş olan bir sınıf oluşturup tüm sayfalarımızı bu -
MyCustomPage - sayfadan türeterek bir nevi çözüm geliştirsek de -sizin çok daha iyi fikriniz olabilir - size önerim bu işi üstlenecek bir
HttpModule hazırlamanız olacaktır.
Burda da ilk akla gelen soru hazırlamış olduğum bu filitreyi HttpModule de hangi event'te sayfanın çıktısına uygulamak. msdn'i biraz kurcaladığımda sayfanın çıktısı üzerine filitre
ReleaseRequestState eventi sırasında uygulandığını öğrendim. Bu durumda aşağıdaki kısacık kod ile sitemizdeki tüm sayfalar üzerinde hazırladığımız bu filitreyi etkin kılabiliriz.
public class HrefFilter : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.ReleaseRequestState += new EventHandler(context_ReleaseRequestState);
}
void context_ReleaseRequestState(object sender, EventArgs e)
{
if (HttpContext.Current.Response.ContentType == "text/html")
{
HttpContext.Current.Response.Filter = new AFilter(HttpContext.Current.Response.Filter);
}
}
}

filter_dosyalar.rar (24.57 KB)