Клиент будет ограничивать количество одновременных запросов к любому одному серверу. Кроме того, при запросе от ресурса, который требует состояния сеанса (по умолчанию), другие запросы ресурсов, требующих состояния сеанса, будут блокироваться.
При использовании HttpWebResponse
вы должны располагать либо этот объект, либо поток, возвращенный его методом GetResponseStream
, для завершения соединения.
Ваш код был очень запутанным. Вы включили буферизацию, установили длину содержимого и использовали сброс. Это приводит к некоторым странным заголовкам HTTP. Обычно с включенной буферизацией вы оставляете настройку заголовка Content-Length для ASP.NET для обработки.
Когда вы используете flush, ASP.NET предполагает, что вы впоследствии можете отправить больше данных. В этом случае он будет использовать чанкованный перевод. Как только ответ завершен, для окончательного фрагмента отправляется окончательный набор заголовков, каждый из которых имеет свой собственный заголовок длины, а общая длина контента получается из них. Первый блок должен , а не иметь заголовок Content-Length, однако ваш код добавляет этот заголовок.
Если вы отключите буферизацию и накачаете байты в выходной поток самостоятельно , то вам следует установить заголовок Content-Length самостоятельно, потому что эффективное отключение буфера означает, что вы берете на себя ответственность именно за то, что отправляется клиенту , Код Марка - простой пример такого насоса, хотя я бы использовал больший буфер, или для MemoryStream метод WriteTo был бы более эффективным.