ASP.NET HttpHandler能够处理http 400 - Bad Request吗?

9
我们有一个HttpHandler直接处理来自自定义客户端软件的二进制POST HTTP数据。客户端软件偶尔会发送导致IIS 7响应400-错误的数据请求。由于“400 Bad Request”在HTTP.SYS中特殊处理且在内核模式下透明地处理它,而不通知用户模式任何内容,因此没有错误被引发以供ASP.NET处理。是否可以在ASP.NET中捕获此http 400错误,以便在这些情况下向响应流写入特定数据?重定向到另一个页面不是选项,因为它需要在当前请求/响应中进行。

1
如果这个问题是“在这里分享你最喜欢的HTTP.SYS和HTTP 400笑话”,现在至少会有238位用户回答了。 - cfeduke
你正在运行IIS7的集成模式或经典模式吗?我不确定,但使用集成模式时,“所有内容”都通过ASP.NET管道传输,因此您可能能够看到错误。在经典模式下,我认为您会遇到问题。但我不确定。 - Nicholas Piasecki
3个回答

2
如果您知道导致400错误的原因,那么您可以通过注册表自定义http.sys的行为来处理它:http://support.microsoft.com/kb/820129。但是,请注意,这样做可能会带来潜在的安全和性能问题。另一个选项是在IIS之前使用过滤代理,从而在请求进一步进行之前捕获请求。

错误来自于无效的内容长度头,根据这个链接:http://technet.microsoft.com/en-us/library/cc786188.aspx,它不能被定制。看起来除非你自己编写一个HTTP服务器,否则可能无法解决这个问题。 - John Lemp

2

我建议你让他们修复客户端软件。向他们展示失败请求的报告。如果可以的话,运行像Wireshark这样的嗅探器并将数据包发送给他们,以便他们相信问题不在他们的软件上。


1

如果您的自定义客户端导致IIS触发HTTP 400错误,那么它可能存在缺陷,并且未按照标准提交有效的HTTP请求。如果您可以更改客户端,则应该这样做。否则,您正在处理的不是HTTP,而IIS设计用于处理HTTP请求。因此,您应该为自己的协议(类似非标准HTTP的东西)运行自定义服务器。

不建议使用IIS/ASP.NET处理此类请求,因为可能会导致一些奇怪的意外情况发生。


错误是由于损坏的有效负载导致的无效内容长度标头。更改客户端软件不是一个选项,我只需要发送一个定制的HTTP响应来通知客户端清除它的有效负载,但是没有办法捕获400错误并向客户端发送任何内容。 - John Lemp
无论是什么,你需要的是一个处理非标准协议(=带有实现错误的标准)的服务器。您可能应编写一个自定义服务器来处理这个问题。我认为Dave R.的代理过滤解决方案是最好的想法。然而,任何解决方案都是一种丑陋的hack。 - Mehrdad Afshari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接