在读取HttpRequest.InputStream之后,第一个请求因HTTP 400(错误请求)而失败

时间:2010-10-24 13:17:04

标签: asp.net http iis

我开发了一个asmx Web服务(即ASP.NET 2.0)。

在处理HTTP请求时,有一段代码可以读取HTTP请求的内容(通过HttpContext.Current.Request.InputStream)。我意识到InputStream可能只被读取一次请求,我确保我从不尝试多次读取它。

问题似乎是如果在应用程序生命周期的早期阶段(例如在pskill w3wp之后,在Application_Start期间)读取了InputStream,则HTTP请求将失败并显示HTTP 400 - 错误请求错误,没有给出解释,没有抛出异常,也没有httperr日志中的条目。如果稍后读取(例如在Web方法本身内),则无论是否读取InputStream,请求都会正常运行。如果未读取InputStream,则Application_Start运行正常。

这是某种ASP.NET错误吗? IIS错误?或者我是否因为敢于阅读InputStream而做错了什么?如果是这样,有没有另一种方法来查看请求的“原始”内容,而不会干扰IIS / ASP.NET的内部工作?

简而言之,在Application_Start中添加此代码足以重现此错误:

using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
    reader.ReadToEnd();

3 个答案:

答案 0 :(得分:1)

无法在不干扰ASP.NET / IIS内部工作的情况下找到在Application_Start期间读取请求内容的方法。相反,最后确保在Application_Start结束之前不会发生这种情况(并且从Application_End开始的那一刻起也不会发生,这也证明是有问题的,并且创建了访问冲突)。 / p>

答案 1 :(得分:1)

你必须不使用使用bloc,因为这会关闭阅读器,从而关闭httprequest的输入流

答案 2 :(得分:0)

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

您想要阅读输入流的事实表明您应该使用Application_BeginRequest而不是这可以访问请求和响应

摘要:

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

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

  3. 有关详细信息,请参阅这些SO文章: