У кого-нибудь есть пример кода для "потоковой" загрузки потокового 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
) и выяснить длину контента и отправить запрос.