带过滤器的HttpModule - 两次调用Writer方法

时间:2008-12-11 08:49:21

标签: c# asp.net httpmodule

我有一个带过滤器的HttpModule(PageFilter),其中每个页面请求都会调用PageFilter的Writer方法两次,但遗憾的是没有相同的结果。

过滤器的想法是找到“”并在此前插入一些文本/脚本。我找到了一堆小错误(并纠正了它们),但这个错误对我起了诡计......

构造函数og PageFilter被调用一次,但每个请求调用它的writer方法两次?

下面是PageFilter.Writer(运行两次)的内容

string strBuffer = System.Text.UTF8Encoding.UTF8.GetString (buffer, offset, count); 

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

    if (!eof.IsMatch(strBuffer))
    {
       //(1)
       responseHtml.Append(strBuffer);
    }
    else
    {
        //(2)
        responseHtml.Append (strBuffer);
        string  finalHtml = responseHtml.ToString ();
        Regex   re = null;

        re = new Regex ("</body>", RegexOptions.IgnoreCase);
        finalHtml = re.Replace(finalHtml, new MatchEvaluator(lastWebTrendsTagMatch));
        // Write the formatted HTML back
        byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes (finalHtml);

        responseStream.Write(data, 0, data.Length);       

       }
    }
    catch (Exception ex)
    {
       Logging.Logger(Logging.Level.Error, "Failed writing the HTML...", ex);
    }

第一次运行case(1)运行并且运行第二种情况(2)运行...这不是我想要的,任何人都知道为什么和/或我如何使其工作(一致)?

2 个答案:

答案 0 :(得分:1)

对于单个页面,可以多次调用Write方法。 HttpWriter对象将数据组合在一起,然后将其写入其输出流。每次HttpWriter发出一大块数据时,都会调用响应过滤器的Write方法。

请参阅此类解决方案......

  1. HttpResponse.Filter write multiple times
  2. 而不是responseStream.Write(data,0,data.Length); 尝试responseStream.Write(data,0,data.Length-1);

    希望你觉得这很有用。

答案 1 :(得分:0)

这些“事件”发生在1页请求中:

  

isAspx = true og / _layouts / not found   (我验证该文件是.aspx和   网址不包含/ _layouts /)

     

PageFilter构造函数名为

     

发起的作家方法......

     (正则表达式):(正则表达式包含    为匹配而创建)

     

!eof.IsMatch(strBuffer):(没有   匹配正则表达式)

     

发起的作家方法......(第二名   围绕着作家的时间)

     (正则表达式):(正则表达式包含    为匹配而创建)

     

正则表达式启动(匹配正则表达式)

     (正则表达式):(找到了身体   标签我需要插入我的脚本)

     

ScriptInclude = true(我找到了   web.config键告诉我的应用程序   应该包括脚本)

     

使用了美国脚本(我使用过美国   该脚本的版本也基于   web配置密钥)

问题是:在我的开发部署中,编写器运行两次,最后得到上面的序列并包含脚本。在我的测试部署中,编写器运行两次,最终不包括脚本......

我想避免两次调用Writer,但更喜欢将脚本包含在测试部署中