我试图理解为什么这个非常简单的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
}
答案 0 :(得分:2)
如果您请求图片,则响应流也会有所不同!
答案 1 :(得分:0)
您确定要监控的请求是否会触发该行的断点?请注意,如果您在/ images文件夹中有一个图像,并且包含该图像的.aspx页面,您的模块将在开发服务器中调用两次(对于aspx和图像),并且只在默认IIS中调用一次(仅限对于aspx文件)。当您同时向模块发出请求时,有时很难看到哪个断点在哪个请求上。
答案 2 :(得分:0)
遗憾的是,答案是我的愚蠢。其中一个被忽视的经典之作!
包含/ image的请求也恰好是二进制文件。因此,响应被写入流而不是页面。