尝试将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.Filter
,IIS 在我们的过滤器开始处理之前抛出 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 不允许)),但我们的代码在经典应用程序池下的许多其他系统上运行没有问题,所以仍然会有成为此服务器配置独有的东西。更改为集成管道会破坏我们的代码正在过滤的应用程序,因此无论如何这都不是可能的解决方法。