慎用IHttpModule

今天看到小舖有人問了一個問題

是關於輸出的html的source有些問題,需要調整

然後發現國外有一位開發者使用

IHttpModule來處理。

今天看到小舖有人問了一個問題

是關於輸出的html的source有些問題,需要調整

然後發現國外有一位開發者使用

IHttpModule來處理。

 

基本上小弟覺得這種問題應該是一次解決才對

而不是放在IHttpModule來處裡

放在IHttpModule中要處裡的話小弟會頃向是因為需要判斷 request當作變數

來依照不同的狀況做不同的回應

既然規則是一樣的那就一次解決就好

該作者的用法是


void IHttpModule.Init(HttpApplication context)
{
    context.BeginRequest += new EventHandler(context_BeginRequest);
}

#endregion

void context_BeginRequest(object sender, EventArgs e)
{
    HttpApplication app = sender as HttpApplication;
    if (app.Request.RawUrl.Contains(".aspx"))
    {
        app.Response.Filter = new WhitespaceFilter(app.Response.Filter);
    }
}

自己寫一個Response.Filter

並在Write做處理

然後我很好奇的試了


public override void Write(byte[] buffer, int offset, int count)
{
    byte[] data = new byte[count];
    Buffer.BlockCopy(buffer, offset, data, 0, count);
    string html = System.Text.Encoding.Default.GetString(buffer);
    html = reg.Replace(html, string.Empty);
    using (StreamWriter sw = new StreamWriter(@"D:\request\" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".txt", true))
    {
        sw.WriteLine("Text");
    }
    byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
    _sink.Write(outdata, 0, outdata.GetLength(0));              
}

結果下場就是每頁面重整一次,就會產生一個新的檔案(代表Write中的code是每次的request都會被呼叫)

我想一兩次也就算了,像這種針對所有的.aspx都做這樣的加工那可不得了

另外如果您在aspx中有設定OutputCache的話倒是不用每次都跑Write


<%@ OutputCache Duration="10" VaryByParam="None" %>

不過該作者的留言中幾乎沒有人對他的程式有疑問

該不會其實那已經是最好的做法了吧…

只是我覺得像那種排版的問題

程式開發人員在開發時就可以參考這個

http://blog.miniasp.com/post/2009/01/How-to-configure-Visual-Studio-to-avoid-layout-broken-in-IE.aspx

如果是單純的html(由設計人員寫的html)

要上版前跑一次移掉多餘空白也就好了的說。

 

HTTP 處理常式和 HTTP 模組概觀