读取HttpWebResponse时出现“流不可读”的错误

5

我正在尝试“屏幕抓取”一些数据。 我有一个如下的请求(来自Fiddler)

POST http://fallenlondon.storynexus.com/Auth/EmailLogin HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Referer: http://fallenlondon.storynexus.com/signup
User-Agent: Mine
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Cache-Control: max-age=0
l: 
Origin: http://fallenlondon.storynexus.com/
DNT: 1
Accept-Encoding: utf-8
Accept-Language: en-GB,en;q=0.8
Cookie: ASP.NET_SessionId=05xq3gndu4nczvy5wsah5qyw; __utma=100212060.1740063036.1431282067.1431282067.1431284767.2; __utmb=100212060.14.10.1431284767; __utmc=100212060; __utmz=100212060.1431282067.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
Host: fallenlondon.storynexus.com
Content-Length: 54

(这段内容是我的凭证)- 此标题与我手动在浏览器中查看网页时跟踪的请求相匹配。

我使用 HttpWebRequest.GetResponse() 发送此请求。 我收到一个响应。

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, must-revalidate
Content-Type: text/html; charset=utf-8
Date: Mon, 11 May 2015 20:54:15 GMT
Expires: -1
Pragma: no-cache
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-AspNetMvc-Version: 4.0
X-Powered-By: ASP.NET
X-Server: Web1
Content-Length: 16900
Connection: keep-alive

这与我使用浏览器获取到的结果一致。 使用Fiddler,我可以看到17k的数据(HTML),我尝试使用...进行阅读。
var stream = response.GetResponseStream();
if (stream == null) return null;
using (var reader = new StreamReader(stream, Encoding.UTF8))
{
   var data = reader.ReadToEnd();
   reader.Close();
   return data;
}

我在“new StreamReader”行上遇到了一个异常,指出“流不可读”。我的调试器显示该流既不可读也不可写。这是我阅读的第二个页面(第一个页面是一个简单的请求主URL以获取登录页面)。使用相同的代码,这很好运作。所有流和请求在使用后都已关闭。
谷歌没有给我任何帮助,建议页面错误(不,状态为200)或已经读取数据(不,代码直接进入这里)。我根本没有使用线程,所以那不是问题。我尝试更改编码(请求gzip会给我更小的负载,如预期,但我仍然无法读取它)。我正在使用c#.net 4.5.2在win7 x64上。
有人知道我做错了什么吗?

只是提醒一下,使用using语句时不需要关闭读取器。一旦using语句失去作用域,读取器将自动关闭和处理。即使您在其中使用了return语句,一旦返回,它也被视为超出范围。 - Jacob Roberts
你尝试过使用 StreamReader.Read() 而不是 StreamReader.ReadToEnd() 吗?也许“end”是未知的。 - Mike Hixson
我还没有...通过调试器检查流,发现该流不可读,我怀疑这并没有帮助。 - Taoist
类似的问题已经有了答案,可能会有所帮助:https://dev59.com/6HVC5IYBdhLWcg3w9GA9#43981770 - João Paulo Melo
1个回答

4

糟糕!由于代码中的“疏忽”,我试图两次读取流!现在已经修复好了。


我没有看到你的代码中哪里“读取了两次流”。那么具体的修复方法是什么? - Jesse Chisholm
问题出在别处,实际上不在这个片段中。 由于进行了大量的重构,程序逻辑出现了错误。 - Taoist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接