2011-06-18 75 views
1

我在C#中构建了一个只覆盖生命周期的EndRequest的http模块,检查响应头的状态代码并在需要时修改响应代码。喜欢的东西:HTTP模块中的响应修改

HttpContext context = ((HttpApplication)source).Context; 
if (context.Response.StatusCode == 200) 
{ 
    context.Response.StatusCode = 404; 
} 

这似乎很好地工作对我来说,当我测试它针对本地主机(实际IIS),但是当我能够从另一台计算机联网访问和测试失败每次。

,当我通过另一台计算机测试我所看到的错误是:

“ HTTP标头后,服务器不能设置状态已发送”

我也注意到,请求两次相同的文件,而在本地它只请求一次文件。我听到有人说输出缓冲,但我也尝试将BeginRequest响应OutputBuffer设置为true,并得到相同的结果。

想法?

回答

4

您需要在发送标题之前修改响应。我从来没有这样做过,但我猜想正确的事件是PreSendRequestHeaderslink

Here's an example在此事件中设置标题。

如果此事件不适用于您,请检查处理程序在管道中的后处理后的一些事件:http://blogs.msdn.com/b/carloc/archive/2007/12/19/application-page-and-control-lifecycle.aspx请小心,因为您可能必须重写IIS 7集成管道的代码。

+1

只是想我会回来,并关闭了这一点。这里有两个问题,其中第一个问题解决了你的建议。第二个问题与管道有关,但不是asp.net的。 IIS有一个“功能”用于在发送某些状态码时返回特定的错误页面。这发生在.NET处理后,但你可以关闭它。如果启用“详细错误”并删除状态代码的处理程序,则会得到未修改的原始页面内容。默认情况下,仅限本地。 – pinvoke