永远不会在HttpWebResponse中结束Stream

kus*_*agi 3 .net c# httpwebresponse

我怎样才能读取一些字节并断开连接?我使用这样的代码

using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
    using (Stream sm = resp.GetResponseStream())
    {
        using (StreamReader sr = new StreamReader(sm, Encoding.Default))
        {
            sr.Read();
            sr.Close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它等待流的结束

Jim*_*hel 5

您可能不希望使用a StreamReader来读取WebResonse流,除非您确定该流包含换行符. StreamReader喜欢用线条思考,如果流中没有任何换行符,它就会挂起.

最好的办法是在byte[]缓冲区中读取所需的字节数,然后将其转换为文本.例如:

int BYTES_TO_READ = 1000;
var buffer = new byte[BYTES_TO_READ];

using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{
    using (Stream sm = resp.GetResponseStream())
    {
        int totalBytesRead = 0;
        int bytesRead;
        do
        {
            // You have to do this in a loop because there's no guarantee that
            // all the bytes you need will be ready when you call.
            bytesRead = sm.Read(buffer, totalBytesRead, BYTES_TO_READ-totalBytesRead);
            totalBytesRead += bytesRead;
        } while (totalBytesRead < BYTES_TO_READ);

        // Sometimes WebResponse will hang if you try to close before
        // you've read the entire stream.  So you can abort the request.
        request.Abort();
    }
}
Run Code Online (Sandbox Code Playgroud)

此时,缓冲区具有缓冲区中的第一个BYTES_TO_READ字节.然后,您可以将其转换为字符串,如下所示:

string s = Encoding.Default.GetString(buffer);
Run Code Online (Sandbox Code Playgroud)

或者,MemoryStream如果要使用,可以在缓冲区上打开StreamReader.

WebResponse如果你不读所有内容,我有时会遇到问题.我不知道它为什么这样做,我无法可靠地重现它,但我发现如果我request.Abort()在关闭流之前做的话,一切正常.看到

在旁注中,你想要的词是"反应迟钝"而不是"不负责任".