我们在尝试将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,但我们的代码在经典应用程序池下的许多其他系统上运行没有问题,所以会仍然必须是这个服务器配置的独特之处。更改为集成管道会破坏我们的代码正在过滤的应用程序,因此无论如何这都不是可能的解决方法。
答案 0 :(得分:2)
原来,这是一个非常模糊的IIS错误:
http://support.microsoft.com/kb/980368
ExtensionlessUrl处理程序(*.
)错误地参与了请求,而不仅仅是WebServiceHandlerFactory(*.asmx
)。解决方法是:
我们不得不在这个上刻录微软支持票,因为我们无法在任何合理的时间范围内解决这个问题。希望这有助于其他人。