Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从HttpWebResponse读取数据时出现问题_C#_.net Core_Httpwebresponse - Fatal编程技术网

C# 从HttpWebResponse读取数据时出现问题

C# 从HttpWebResponse读取数据时出现问题,c#,.net-core,httpwebresponse,C#,.net Core,Httpwebresponse,我有一个.Net核心程序,可以读取Internet上页面的内容。我使用一个HttpWebRequest,并具有一个读取结果内容的函数(如下所示) 在阅读了十几页(有时是两三页)之后,一切正常,直到圣·里德的电话挂断。它似乎会永久冻结,即使我整晚都开着它。st流不支持设置Timeout属性,因此我不能使用它来简单地中止。我更喜欢阅读页面,但即使它只是超时,至少线程不会无限期地挂起。据我所知,这些页面通常是完全有效的(在我的浏览器中加载很好)。我从一个.NETFramework应用程序移植了这段代码

我有一个.Net核心程序,可以读取Internet上页面的内容。我使用一个HttpWebRequest,并具有一个读取结果内容的函数(如下所示)


在阅读了十几页(有时是两三页)之后,一切正常,直到圣·里德的电话挂断。它似乎会永久冻结,即使我整晚都开着它。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);
        }
    }