Ошибка & ldquo; Этот поток не поддерживает операции поиска & rdquo; в C #

Идея состоит в том, чтобы использовать innerHTML в промежуточном элементе, а затем переместить все его дочерние узлы туда, где вы действительно хотите их через appendChild.

var target = document.getElementById('test');
var str = '<p>Just some <span>text</span> here</p>';

var temp = document.createElement('div');
temp.innerHTML = str;
while (temp.firstChild) {
  target.appendChild(temp.firstChild);
}

Это позволяет избежать уничтожения любого события обработчики на div#test, но все же позволяют добавлять строку HTML.

44
задан Yustme 28 April 2015 в 20:43
поделиться

5 ответов

Вы, наверное, хотите что-то подобное. Либо проверка длины не выполняется, либо BinaryReader выполняет поиск за кулисами.

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResp = myReq.GetResponse();

byte[] b = null;
using( Stream stream = myResp.GetResponseStream() )
using( MemoryStream ms = new MemoryStream() )
{
  int count = 0;
  do
  {
    byte[] buf = new byte[1024];
    count = stream.Read(buf, 0, 1024);
    ms.Write(buf, 0, count);
  } while(stream.CanRead && count > 0);
  b = ms.ToArray();
}

править:

Я проверил с помощью отражателя, и это вызвало ошибку при вызове stream.Length. GetResponseStream возвращает ConnectStream, а свойство Length в этом классе вызывает исключение, которое вы видели. Как упоминалось в других плакатах, вы не можете надежно получить длину HTTP-ответа, так что это имеет смысл.

71
ответ дан 26 November 2019 в 19:34
поделиться

Вместо этого используйте StreamReader :

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResp = myReq.GetResponse();

StreamReader reader = new StreamReader(myResp.GetResponseStream());
return reader.ReadToEnd();

(Примечание - приведенное выше возвращает String вместо массива байтов)

12
ответ дан 26 November 2019 в 19:34
поделиться

Вы не можете надежно запросить длину HTTP-соединения. Можно заставить сервер отправить вам длину заранее, но (а) этот заголовок часто отсутствует и (б) не гарантируется, что он будет правильным.

Вместо этого вам следует:

  1. Создать байт фиксированной длины byte[], который вы передадите методу Stream.Read
  2. Создать List
  3. После каждого чтения вызывайте List. AddRange для добавления содержимого буфера фиксированной длины в список байтов

Обратите внимание, что последний вызов Read вернет меньше, чем полное количество байтов, которое вы запрашивали. Убедитесь, что вы добавляете только это количество байт в ваш List, а не весь byte[], иначе вы получите мусор в конце списка.

7
ответ дан 26 November 2019 в 19:34
поделиться

Если сервер не отправляет спецификацию длины в HTTP-заголовке, размер потока неизвестен, поэтому при попытке использовать свойство Length вы получите ошибку.

Читайте поток меньшими частями, пока не достигнете конца потока.

5
ответ дан 26 November 2019 в 19:34
поделиться

Длина потока не может быть прочитана из потока, так как получатель не знает, сколько байт отправит отправитель. Попробуйте наложить протокол поверх http и послать т.е. длину как первый элемент в потоке.

0
ответ дан 26 November 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: