【发布时间】:2013-04-27 06:00:26
【问题描述】:
在尝试将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,但我们的代码在经典应用程序池下的许多其他系统上运行没有问题,因此仍然会有成为此服务器配置独有的东西。更改为集成管道会破坏我们的代码正在过滤的应用程序,因此无论如何这都不是可行的解决方法。
【问题讨论】:
标签: .net-4.0 iis-7.5 httpresponse windows-server-2008-r2 responsestream