首次请求从读取HttpRequest.InputStream开始后遇到HTTP 400(错误请求)错误。

3
我开发了一个asmx web服务(即ASP.NET 2.0)。在处理过程中,有一段代码可以读取HTTP请求的内容(通过HttpContext.Current.Request.InputStream)。我意识到InputStream只能被读取一次,所以我确保不会尝试多次读取。
问题似乎在于如果在应用程序生命周期的早期阶段(例如在pskill w3wp之后,在Application_Start期间)读取InputStream,则HTTP请求将失败并显示HTTP 400 - Bad Request错误,没有解释,没有抛出异常,并且httperr日志中没有条目。如果稍后读取它(例如在web方法内部),则无论是否读取InputStream,请求都会正常运行。如果未读取InputStream,则Application_Start运行正常。
这是某种ASP.NET bug吗?IIS bug?或者我正在尝试读取InputStream而做错了什么事情?如果是这样,是否有另一种方法来查看请求的“原始”内容,而不会干扰IIS/ASP.NET的内部工作?
简而言之,在Application_Start中添加此代码就足以重现此错误。
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
    reader.ReadToEnd();

我认为你需要发布一些能够重现这个问题的代码。不要发布所有的代码,只需发布足够让人们运行和重现问题的部分即可。 - Kev
你的建议促使我深入调查了一下。问题已经相应地修改了。谢谢! - Yodan Tauber
我不相信在Application_Start中调用reader.RadToEnd是可能的,因为请求可能没有完全接收。 - Genady Sergeev
是的,那正是我猜测的。我正在寻找一种在不干扰 ASP.NET 的情况下读取请求内容的方法。 - Yodan Tauber
3个回答

1

在不干扰 ASP.NET/IIS 的内部工作的情况下,找不到在 Application_Start 期间读取请求内容的方法。相反,最终确保这种情况直到 Application_Start 结束后才发生(同时也不会在 Application_End 开始时发生,这也被证明是有问题的,并且会创建访问冲突)。


1

你不能使用using块,因为这会导致关闭读取器并因此关闭httprequest的输入流。


0

我建议不要Application_Start期间尝试读取Request.InputStream - 它用于初始化应用程序。从Application_Start中访问请求对象会导致异常“此上下文中不可用请求”。

您想要读取输入流的事实表明,您应该改用Application_BeginRequest - 它可以访问请求和响应

总之:

  1. Application_Start
    应用程序启动时触发一次。虽然通常由第一个请求触发,但它发生在设置第一个请求之前。不要在此处执行请求特定代码,因为它无法访问请求和响应。

  2. Application_BeginRequest
    在调用任何页面处理程序之前为每个请求触发 - 您可以读取输入、写入响应、结束请求等...

请参阅这些SO文章以获取更多信息:


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