ASP.NET HttpModule,将Response.Write用于当前上下文时的奇怪行为

时间:2010-10-28 09:57:10

标签: c# .net-3.5 httpmodule iis-5

我试图理解为什么这个非常简单的HttpModule失败了。代码是我需要为测试项目开发的简单HttpUrlRewriter的前身。

看来每当我测试Request,然后执行Response时,输出都不会写入流!

我已将调试器(VS 2008)附加到模块,并且下面的所有3个Response.Write语句都被执行,但只有两个外部实际上是产品输出在页面上。我是否错过了重要的理解或警告?

感谢您的帮助。

执行环境:ASP.NET 3.5 / WinXP / IIS 5

使用System; 使用System.Collections.Generic; 使用System.Web; 使用System.Text; 使用System.Web.UI;

public class Interceptor : IHttpModule
{
    #region IHttpModule Members

    public void Dispose() { }

    public void Init(HttpApplication context)
    {
        context.EndRequest += new EventHandler(TestHandler);
    }

    private void TestHandler(object sender, EventArgs e)
    {
        HttpApplication app = (HttpApplication)sender;
        HttpContext ctx = app.Context;

        if (1 == 1)
        {
            ctx.Response.Write("Hello, 2"); // Works, as expected
        }

        string test = ctx.Request.Url.ToString();
        if (test.Contains("/images")) {
            ctx.Response.Write("Hello, never written"); // This code executes when the test passes, but nothing is ever written...
        }

        ctx.Response.Write("Hello"); // Works

    }

    #endregion
}

3 个答案:

答案 0 :(得分:2)

如果您请求图片,则响应流也会有所不同!

答案 1 :(得分:0)

您确定要监控的请求是否会触发该行的断点?请注意,如果您在/ images文件夹中有一个图像,并且包含该图像的.aspx页面,您的模块将在开发服务器中调用两次(对于aspx和图像),并且只在默认IIS中调用一次(仅限对于aspx文件)。当您同时向模块发出请求时,有时很难看到哪个断点在哪个请求上。

答案 2 :(得分:0)

遗憾的是,答案是我的愚蠢。其中一个被忽视的经典之作!

包含/ image的请求也恰好是二进制文件。因此,响应被写入流而不是页面。