C# 从HttpWebResponse读取数据时出现问题
我有一个.Net核心程序,可以读取Internet上页面的内容。我使用一个HttpWebRequest,并具有一个读取结果内容的函数(如下所示)C# 从HttpWebResponse读取数据时出现问题,c#,.net-core,httpwebresponse,C#,.net Core,Httpwebresponse,我有一个.Net核心程序,可以读取Internet上页面的内容。我使用一个HttpWebRequest,并具有一个读取结果内容的函数(如下所示) 在阅读了十几页(有时是两三页)之后,一切正常,直到圣·里德的电话挂断。它似乎会永久冻结,即使我整晚都开着它。st流不支持设置Timeout属性,因此我不能使用它来简单地中止。我更喜欢阅读页面,但即使它只是超时,至少线程不会无限期地挂起。据我所知,这些页面通常是完全有效的(在我的浏览器中加载很好)。我从一个.NETFramework应用程序移植了这段代码
在阅读了十几页(有时是两三页)之后,一切正常,直到圣·里德的电话挂断。它似乎会永久冻结,即使我整晚都开着它。st流不支持设置Timeout属性,因此我不能使用它来简单地中止。我更喜欢阅读页面,但即使它只是超时,至少线程不会无限期地挂起。据我所知,这些页面通常是完全有效的(在我的浏览器中加载很好)。我从一个.NETFramework应用程序移植了这段代码,当时没有这个问题。我做错什么了吗?是否有更好的方法读取数据,或者至少有一种方法在读取功能无法读取数据时返回?
read
将在网络流上阻塞,直到有那么多数据可用。您可能希望查看DataAvailable,但是,有更简洁和优雅的方法从HttpWebResponse获取数据。首先,当代码中抛出OutOfMemoryException时,您没有处理MemoryStream,这可能是导致泄漏的原因。如果您的观点只是将一个流复制到另一个流,那么您应该查看Read
将阻塞网络流,直到有那么多数据可用。您可能希望查看DataAvailable,但是,有更简洁和优雅的方法从HttpWebResponse获取数据。首先,当代码中抛出OutOfMemoryException时,您没有处理MemoryStream,这可能是导致泄漏的原因。如果您的观点只是将一个流复制到另一个流,那么您应该看看
private byte[] ReadFullStream(System.IO.Stream st) {
try {
System.Threading.Monitor.Enter(_lock);
bool canTimeout = st.CanTimeout;
int totalBytesRead = 0;
byte[] buffer = new byte[65536];
MemoryStream ms = new MemoryStream();
bool finished = false;
while (!finished) {
Int32 bytesRead = st.Read(buffer, 0, buffer.Length);
totalBytesRead += bytesRead;
if (bytesRead > 0) {
try {
ms.Write(buffer, 0, bytesRead);
}
catch (OutOfMemoryException oome) {
throw new OutOfMemoryException(
"Failed to write " + buffer.Length +
" bytes to memory stream. Memory stream already has " + ms.Length, oome);
}
}
else {
finished = true;
}
}
var ret = ms.ToArray();
ms.Close();
return ret;
}
finally {
st.Close();
System.Threading.Monitor.Exit(_lock);
}
}