1

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

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.FilterIIS 在我们的过滤器开始处理之前抛出 405 异常

我们的代码以前在几个类似的系统上工作过,所以我们怀疑这个特定服务器上的 IIS/机器配置是负责任的。 这可能是什么原因造成的?

在这种情况下,最常报告的 405 错误原因似乎是使用 Url.Rewrite。(不允许使用 HTTP 动词 POST 来访问路径“/test.html”)但是,我们从不使用 Url.Rewrite。

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

应用程序池在经典管道中运行 .NET 4.0( jQuery AJAX 帖子收到 405 错误(HTTP 动词 POST 不允许)),但我们的代码在经典应用程序池下的许多其他系统上运行没有问题,所以仍然会有成为此服务器配置独有的东西。更改为集成管道会破坏我们的代码正在过滤的应用程序,因此无论如何这都不是可能的解决方法。

4

1 回答 1

2

事实证明,这是一个非常模糊的 IIS 错误:

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

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

  1. 从 Web 应用程序的处理程序映射中手动删除 ExtensionlessUrl 处理程序条目
  2. 手动将 ExtensionlessUrl 处理程序条目移动到您实际希望被命中的任何内容下
  3. 在 system.webServer/handlers 下添加一个 web.config 条目以根据需要删除 ExtensionslessUrl 处理程序(我们使用此选项以确保它包含在应用程序部署中)

我们不得不为此烧毁 Microsoft 支持票,因为我们无法在任何合理的时间范围内解决这个问题。希望这对其他人有帮助。

于 2013-05-08T14:03:50.267 回答