получение длины ответа для загрузки HttpWebRequest из другого веб-файла для потоковой передачи в загрузку, когда источник не реализует ContentLength?

StackOverflow https://stackoverflow.com/questions/1865326

Вопрос

Предыстория - Я пытаюсь передать существующую веб-страницу в отдельное веб-приложение, используя HttpWebRequest / HttpWebResponse на C #.Одна из проблем, с которой я сталкиваюсь, заключается в том, что я пытаюсь установить длину содержимого запроса на загрузку файла, используя длину содержимого для загрузки файла, ОДНАКО проблема, похоже, заключается в том, что исходная веб-страница находится на веб-сервере, для которого HttpWebResponse не предоставляет длину содержимого.

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest;
 using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse)
 {
   var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath"));
   uploadRequest.Method = "POST";
   uploadRequest.ContentLength = downloadResponse.ContentLength;  // ####

ВОПРОС:Как я мог бы обновить этот подход, чтобы учесть этот случай (когда в ответе на загрузку не задана длина содержимого).Возможно, это было бы для того, чтобы каким-то образом использовать MemoryStream?Мы будем признательны за любой пример кода.

Это было полезно?

Решение

Если вы готовы полностью загрузить ответ с другого веб-сервера, это действительно облегчило бы жизнь.Просто повторно записывайте в MemoryStream при извлечении с первого веб-сервера, тогда вы знаете длину, которую нужно установить для второго запроса, и вы можете легко записать данные (тем более, что MemoryStream имеет WriteTo метод записи его содержимого в другой поток).

Недостатком этого является то, что вы будете занимать много памяти, если это большой файл.Может ли это быть проблемой в вашей ситуации?Альтернативы включают в себя:

  • Запись в файл вместо использования MemoryStream.Конечно, после этого вам нужно будет очистить файл - вы в основном используете файловую систему как большую память :)
  • Использование фрагментированной кодировки передачи для "чтения фрагмента, записи фрагмента";это мочь будьте внимательны, чтобы сделать все правильно - это, конечно, не то, что я делал раньше.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top