我遇到的问题是外部因素导致我的应用池排队请求并挂起。当客户端发出HTTP请求以某种方式失去与我的服务器的TCP层连接时,问题似乎是由服务器尝试读取POST给它的所有数据。
我正在使用异步HTTP处理程序,我使用以下代码来读取所有发布的数据:
string post_data = new StreamReader(context.Request.InputStream).ReadToEnd();
我相信正在发生的事情是“ReadToEnd()”阻塞了我的工作线程,当TCP层丢失时,线程卡在那里试图无限期地读取。我怎样才能防止这种情况发生?
我目前正在使用.NET 2.0进行编码,但如果需要,我可以使用更新的框架。
答案 0 :(得分:2)
HttpRequest.InputStream将同步读取整个请求,然后将Stream作为一个巨大的块返回。你会想要这样的东西(需要.NET 4.5):
string body = await new StreamReader(request.GetBufferlessInputStream()).ReadToEndAsync();
GetBufferlessInputStream()不会急切地读取整个请求;它返回一个按需读取请求的Stream。然后,ReadToEndAsync()将从此Stream异步读取,而不会占用工作线程。
要创建.NET 4.5样式的异步处理程序,请继承HttpTaskAsyncHandler类。有关.NET 4.5中async / await的更多信息,请参阅this blog post。您还必须target .NET 4.5 in Web.config才能获得此功能。