【发布时间】:2010-10-24 13:17:03
【问题描述】:
我开发了一个 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 错误吗? IIS错误?还是我敢于阅读 InputStream 做错了什么?如果是这样,是否有另一种方法可以在不干扰 IIS/ASP.NET 内部工作的情况下查看请求的“原始”内容?
简而言之,在 Application_Start 中添加此代码就足以重现此错误:
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream))
reader.ReadToEnd();
【问题讨论】:
-
我认为您需要发布一些重现此问题的代码。不要发布你所有的代码,只需要人们运行和重现即可。
-
您的建议迫使我进行更深入的调查。问题相应修改。谢谢!
-
我不认为可以在 Application_Start 中调用 reader.RadToEnd,因为请求可能尚未完全收到。
-
是的,这确实是我的猜测。我正在寻找一种在不干扰 ASP.NET 的情况下读取请求内容的方法。