Идея состоит в том, чтобы использовать 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.
Вы, наверное, хотите что-то подобное. Либо проверка длины не выполняется, либо 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-ответа, так что это имеет смысл.
Вместо этого используйте StreamReader :
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResp = myReq.GetResponse();
StreamReader reader = new StreamReader(myResp.GetResponseStream());
return reader.ReadToEnd();
(Примечание - приведенное выше возвращает String
вместо массива байтов)
Вы не можете надежно запросить длину HTTP-соединения. Можно заставить сервер отправить вам длину заранее, но (а) этот заголовок часто отсутствует и (б) не гарантируется, что он будет правильным.
Вместо этого вам следует:
byte[]
, который вы передадите методу Stream.Read
List
List. AddRange
для добавления содержимого буфера фиксированной длины в список байтовОбратите внимание, что последний вызов Read
вернет меньше, чем полное количество байтов, которое вы запрашивали. Убедитесь, что вы добавляете только это количество байт в ваш List
, а не весь byte[]
, иначе вы получите мусор в конце списка.
Если сервер не отправляет спецификацию длины в HTTP-заголовке, размер потока неизвестен, поэтому при попытке использовать свойство Length
вы получите ошибку.
Читайте поток меньшими частями, пока не достигнете конца потока.
Длина потока не может быть прочитана из потока, так как получатель не знает, сколько байт отправит отправитель. Попробуйте наложить протокол поверх http и послать т.е. длину как первый элемент в потоке.