405(不允许POST)尝试应用HttpResponse.Filter时出现HttpException

时间:2013-05-02 22:16:35

标签: .net-4.0 iis-7.5 httpresponse windows-server-2008-r2 responsestream

我们在尝试将ResponseStreamFilter应用于HttpResponse.Filter时从IIS7收到405错误和以下异常:

HttpException: 
The HTTP verb POST used to access path '/app/Thing.asmx/Command' is not allowed.

我们正在使用带有如下代码的HttpModule来应用过滤器:

var rfs = new ResponseFilterStream(HttpContext.Current.Response.Filter);
rfs.TransformStream +=
    new Func<System.IO.MemoryStream, System.IO.MemoryStream>(ProcessStream);
HttpContext.Current.Response.Filter = rfs;
Log("Response stream filter applied correctly.");

我们的HttpModule中的所有代码都运行得很好...它只是为了安全而包装在try-catch中,并没有抛出任何异常,并且像上一行那样的诊断日志记录正常工作。

但看起来上面代码中的ProcessStream方法永远不会被调用。如果我们将过滤器应用于HttpResponse.Filter,则 IIS会在我们的过滤器开始处理之前抛出405异常。

我们的代码以前在几个类似的系统上运行过,所以我们怀疑这个特定服务器上的IIS /机器配置是否负责。可能导致这种情况的原因是什么?

在这种情况下,最常报告405错误的原因似乎是使用Url.Rewrite。 (The HTTP verb POST used to access path '/test.html' is not allowed)但是,我们从不使用Url.Rewrite。

另一个常见的原因是请求URL中的尾部斜杠。 (HTTP 405 on Error on HTTP POST IIS ASP .NET)但如上所述,请求的URL不以斜杠结尾。

应用程序池 在经典管道(jQuery AJAX post receives 405 error (HTTP verb POST not allowed))中运行.NET 4.0,但我们的代码在经典应用程序池下的许多其他系统上运行没有问题,所以会仍然必须是这个服务器配置的独特之处。更改为集成管道会破坏我们的代码正在过滤的应用程序,因此无论如何这都不是可能的解决方法。

1 个答案:

答案 0 :(得分:2)

原来,这是一个非常模糊的IIS错误:

http://support.microsoft.com/kb/980368

ExtensionlessUrl处理程序(*.)错误地参与了请求,而不仅仅是WebServiceHandlerFactory(*.asmx)。解决方法是:

  1. 从Web应用程序的处理程序映射中手动删除ExtensionlessUrl处理程序条目
  2. 在您实际期望被击中的任何内容下手动移动ExtensionlessUrl处理程序条目
  3. 在system.webServer / handlers下添加web.config条目以根据需要删除ExtensionslessUrl处理程序(我们选择此选项以确保它包含在app demployment中)
  4. 我们不得不在这个上刻录微软支持票,因为我们无法在任何合理的时间范围内解决这个问题。希望这有助于其他人。