5

背景- C# で HttpWebRequest/HttpWebResponse を使用して、既存の Web ページを別の Web アプリケーションにストリーミングしようとしています。私が印象的な問題の 1 つは、ファイル ダウンロードのコンテンツ長を使用してファイル アップロード リクエストのコンテンツ長を設定しようとしていることですが、ソース Web ページが HttpWebResponse がない Web サーバー上にある場合に問題が発生するようです。コンテンツの長さを提供します。

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 を使用するのでしょうか? サンプルコードをいただければ幸いです。 特に、コンテンツの長さを提供しないソース Web サーバーの問題を回避するために、「チャンクされた」HTTP ダウンロードとアップロードを行う方法を示すコード サンプルはありますか?

ありがとう

4

1 に答える 1

5

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また、アプリオリに値を知ることについて心配する必要はないことに注意してください。ご想像のとおり、 onに設定SendChunkedしてから、ダウンロード ストリームからアップロード ストリームにコピーするだけで済みます。または、を設定せずにコピーを実行するだけで、(私の知る限り)データを内部的にバッファリングし(on に設定されていることを確認してください)、コンテンツの長さを把握してリクエストを送信します。trueuploadRequestchunkedHttpWebRequestAllowWriteStreamBufferingtrueuploadrequest

于 2009-12-08T20:36:00.073 に答える