当尝试将ResponseStreamFilter应用于HttpResponse时,我们从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。(HTTP动词POST用于访问路径'/test.html'但是,我们从不使用Url.Rewrite。另一个常见的报告原因是请求URL中的尾斜杠。(HTTP 405 on Error on HTTP POST IIS ASP . net)但如上所述,被请求的URL不以斜杠结束。
应用池在经典管道中运行。net 4.0 (jQuery AJAX post接收405错误(HTTP动词post不允许)),但是我们的代码在经典应用池下的许多其他系统上运行没有问题,所以这个服务器的配置仍然有一些独特的东西。更改为集成管道会破坏我们的代码正在过滤的应用程序,所以无论如何,这都不是一个可能的解决方案。
原来,这是一个非常不起眼的IIS bug:
http://support.microsoft.com/kb/980368 ExtensionlessUrl处理程序(*.
)不正确地参与请求,而不仅仅是WebServiceHandlerFactory (*.asmx
)。解决方法是:
- 从web应用程序的处理程序映射中手动删除ExtensionlessUrl处理程序条目
- 手动移动ExtensionlessUrl处理程序条目在任何你实际期望被击中的
- 添加web。系统下的配置条目。webServer/handlers根据需要删除ExtensionslessUrl处理程序(我们使用此选项以确保它包含在应用程序部署中)
我们不得不在这个问题上烧掉微软的支持票,因为我们不可能在任何合理的时间范围内解决这个问题。