1

我有一个带有过滤器(PageFilter)的 HttpModule,其中 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) 运行并在第二个 case (2) 运行......这不是我想要的,任何人都知道为什么和/或如何让它工作(一致地)?

4

2 回答 2

1

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

请参阅此以获取一种解决方案...

  1. HttpResponse.Filter 多次写入

而不是 responseStream.Write(data, 0, data.Length); 尝试 responseStream.Write(data, 0, data.Length-1);

希望您觉得这个有帮助。

于 2008-12-11T10:55:09.460 回答
0

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

isAspx = true og /_layouts/ 未找到(我验证文件是 .aspx 且 URL 不包含 /_layouts/)

调用 PageFilter 构造函数

编写器方法已启动...

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

!eof.IsMatch(strBuffer): (与正则表达式不匹配)

编写器方法已启动...(第二次调用编写器)

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

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

re(正则表达式):(找到插入脚本所需的正文标签)

ScriptInclude = true(我发现 web.config 键告诉我的应用它应该包含脚本)

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

问题是:在我的开发部署中,编写器运行了两次,以上述序列和包含的脚本结束。在我的测试部署中,作者运行了两次,最终不包括脚本......

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

于 2008-12-11T12:29:24.247 回答