我写了一个自定义的IHttpModule但是当源中没有结束标记时它会引发问题。我在CMS中运行了几个页面我正在运行这个页面,因为.aspx页面的使用更像是一个处理程序,并且放弃关闭html以通过ajax将响应返回给用户。
这是我的来源:
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
}
正如你所看到的那样,这很好,因为它只会在最后一次调用Write时进行替换,但是如果输出没有关闭HTML标记,那就是blammo。
我最好的选择是,如果找不到结束html,甚至不添加新的过滤器。但我认为我不能尽早拦截整个流。如果没有,那么除了寻找关闭的html标签之外还有另一种检测Write的方法是在流的末尾吗?
提前致谢。
答案 0 :(得分:0)
好吧,如果它是WebForms,你应该可以在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);
}