2011-07-13 11 views
0

私はカスタムIHttpModuleを書きましたが、ソースに終了タグがないと問題を引き起こしています。私はCMSのいくつかのページに亘って走っています。これは、.aspxページがハンドラのように使用され、htmlを閉じてajaxを介してユーザーに応答するために実行しています。ここで IHttpModule Response.Filter Write With No Close HTML

は私のソースです:あなたは出力が閉じHTMLタグを持っていない場合にのみblammo、書き込みが呼び出された最後の時間を置き換えますが、ないので、これは素晴らしいです見ることができるように

public class HideModule : IHttpModule 
{ 
    public void Dispose() 
    { 
     //Empty 
    } 

    public void Init(HttpApplication app) 
    { 
     app.ReleaseRequestState += new EventHandler(InstallResponseFilter); 
    } 

    // --------------------------------------------- 
    private void InstallResponseFilter(object sender, EventArgs e) 
    { 
     HttpResponse response = HttpContext.Current.Response; 

     string filePath = HttpContext.Current.Request.FilePath; 
     string fileExtension = VirtualPathUtility.GetExtension(filePath); 

     if (response.ContentType == "text/html" && fileExtension.ToLower() == ".aspx") 
      response.Filter = new PageFilter(response.Filter); 
    } 
} 

public class PageFilter : Stream 
{ 
    Stream   responseStream; 
    long   position; 
    StringBuilder responseHtml; 

    public PageFilter (Stream inputStream) 
    { 
     responseStream = inputStream; 
     responseHtml = new StringBuilder(); 
    } 

    //Other overrides here 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     string strBuffer = System.Text.UTF8Encoding.UTF8.GetString (buffer, offset, count); 

     Regex eof = new Regex ("</html>", RegexOptions.IgnoreCase); 

     if (!eof.IsMatch (strBuffer)) 
     { 
      responseHtml.Append (strBuffer); 
     } 
     else 
     { 
      responseHtml.Append (strBuffer); 

      string finalHtml = responseHtml.ToString(); 

      //Do replace here 

      byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml); 

      responseStream.Write(data, 0, data.Length); 
     } 
    } 
    #endregion 
} 

私の最善の選択肢は、閉じたhtmlが見つからない場合は、新しいフィルタを追加しないことです。しかし、私は早くフルストリームを傍受できるとは思わない。それが失敗するのは、終了HTMLタグを探す以外にストリームの終わりにWriteを検出する別の方法ですか?

ありがとうございます。

答えて

0

まあ、それはWebフォームをだならば、あなたはあなたのInstallResponseFilter機能でこのような何かを行うことができるはず:

if(Application.Context.CurrentHandler is System.Web.UI.Page 
        && Application.Request["HTTP_X_MICROSOFTAJAX"] == null 
        && Application.Request.Params["_TSM_CombinedScripts_"] == null) 
{ 
response.Filter=new PageFilter(response.Filter); 
}