我开发了一个 asmx 网络服务(即 ASP.NET 2.0)。
有一段代码可以在处理它时读取 HTTP 请求的内容(通过 HttpContext.Current.Request.InputStream
)。我意识到对于一个请求 InputStream 可能只被读取一次,我确保我永远不会尝试读取它超过一次。
问题似乎是,如果 InputStream 恰好在应用程序生命周期的早期阶段被读取(例如,在 pskill w3wp
之后,在 Application_Start 期间),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();
最佳答案
找不到在 Application_Start 期间读取请求内容而不干扰 ASP.NET/IIS 内部工作的方法。相反,最终确保在 Application_Start
结束之前不会发生这种情况(并且从 Application_End
开始的那一刻起也不会发生,这也被证明是有问题的创建了访问冲突)。
关于asp.net - 读取 HttpRequest.InputStream 后,第一个请求因 HTTP 400(错误请求)而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008360/