我开发了一个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();
答案 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
而不是这可以访问请求和响应。
摘要:
Application_Start
应用程序启动时触发一次。虽然通常由第一个请求触发,但它在第一个请求建立之前发生。请勿在此处请求特定代码,因为它无权访问请求和响应。
Application_BeginRequest
在调用任何页面处理程序之前触发每个请求 - 您可以读取输入,写入响应,结束请求等...
有关详细信息,请参阅这些SO文章: