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

Фон. Я пытаюсь передать существующую веб-страницу в отдельное веб-приложение, используя 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? Любой образец кода будет оценен по достоинству.


person Greg    schedule 08.12.2009    source источник


Ответы (1)


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

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

  • Запись в файл вместо использования MemoryStream. Конечно, вам нужно будет очистить файл после этого - вы в основном используете файловую систему как большую память :)
  • Использование фрагментированного кодирования передачи для «чтения фрагмента, записи фрагмента»; это может быть неудобным, чтобы сделать это правильно - я определенно не делал этого раньше.
person Jon Skeet    schedule 08.12.2009
comment
Раздельный подход звучит интересно. Кто-нибудь знает, поддерживает ли HttpWebRequest это? Является ли это поведением по умолчанию для загрузки, если вы не установили длину содержимого? - person Greg; 08.12.2009
comment
@Greg: Честно говоря, я не уверен - предлагаю вам поэкспериментировать :) - person Jon Skeet; 08.12.2009