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



当尝试将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)。解决方法是:

  1. 从web应用程序的处理程序映射中手动删除ExtensionlessUrl处理程序条目
  2. 手动移动ExtensionlessUrl处理程序条目在任何你实际期望被击中的
  3. 添加web。系统下的配置条目。webServer/handlers根据需要删除ExtensionslessUrl处理程序(我们使用此选项以确保它包含在应用程序部署中)

我们不得不在这个问题上烧掉微软的支持票,因为我们不可能在任何合理的时间范围内解决这个问题。

相关内容

  • 没有找到相关文章

最新更新