У кого-нибудь есть пример кода для "потоковой" загрузки потокового HTTP одной веб-страницы непосредственно на загрузку на отдельный веб-сервер?

Справочная информация - я пытаюсь передать существующую веб-страницу в отдельное веб-приложение, используя 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 возможно? Любой пример кода будет оценен. В частности, есть ли у кого-нибудь пример кода, который показывает, как выполнить "порцию" загрузки и выгрузки HTTP, чтобы избежать проблем с исходным веб-сервером, не обеспечивающим длину содержимого?

Спасибо

1 ответ

Решение

Как я уже подал заявку на форумах Microsoft, у вас есть несколько вариантов.

Тем не менее, это то, как я бы сделал это с MemoryStream:

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest;

byte [] buffer = new byte[4096];
using (MemoryStream ms = new MemoryStream())
using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse)
{
    Stream respStream = downloadResponse.GetResponseStream();
    int read = respStream.Read(buffer, 0, buffer.Length);

    while(read > 0)
    {
        ms.Write(buffer, 0, read);
        read = respStream.Read(buffer, 0, buffer.Length);
    }

    // get the data of the stream
    byte [] uploadData = ms.ToArray();

    var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath"));
    uploadRequest.Method = "POST";
    uploadRequest.ContentLength = uploadData.Length;

    // you know what to do after this....
}

Кроме того, обратите внимание, что вам действительно не нужно беспокоиться о знании значения для ContentLength априори. Как вы уже догадались, вы могли бы установить SendChunked в true на uploadRequest, а затем просто скопировать из потока загрузки в поток загрузки. Или вы можете просто сделать копию без настройки chunked, а также HttpWebRequest (насколько я знаю) буферизует данные внутренне (убедитесь, что AllowWriteStreamBuffering установлен в true на uploadrequest) и выяснить длину контента и отправить запрос.

Другие вопросы по тегам