Вы, вероятно, не хотите использовать 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();
}
}
На данный момент, буфер имеет первые BYTES_TO_READ
байтов из буфера. Затем вы можете преобразовать это в строку, например так:
string s = Encoding.Default.GetString(buffer);
Или вы можете открыть MemoryStream
в буфере, если хотите использовать StreamReader
.
Я иногда сталкиваюсь с WebResponse
зависанием, если вы не все читаете. Я не знаю, почему это происходит, и я не могу надежно воспроизвести это, но я обнаружил, что если я сделаю request.Abort()
до закрытия потока, все будет работать. См
На дополнительном примечании нужное вам слово "не отвечает", а не "не отвечает".