получение длины ответа для загрузки HttpWebRequest из другого веб-файла для потоковой передачи в загрузку, когда источник не реализует ContentLength?
-
16-09-2019 - |
Вопрос
Предыстория - Я пытаюсь передать существующую веб-страницу в отдельное веб-приложение, используя 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
.Конечно, после этого вам нужно будет очистить файл - вы в основном используете файловую систему как большую память :) - Использование фрагментированной кодировки передачи для "чтения фрагмента, записи фрагмента";это мочь будьте внимательны, чтобы сделать все правильно - это, конечно, не то, что я делал раньше.