ソースが ContentLength を実装していない場合、アップロードにストリーミングするために別の Web ファイルから HttpWebRequest アップロードの responseLength を取得しますか?
-
16-09-2019 - |
質問
背景 - 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 サーバーからの応答を完全にダウンロードできれば、作業は確かに楽になるでしょう。最初の Web サーバーからフェッチするときに MemoryStream に繰り返し書き込むだけで、2 番目のリクエストに設定する長さがわかり、データを簡単に書き込むことができます (特に MemoryStream
があります WriteTo
コンテンツを別のストリームに書き込むメソッド)。
この欠点は、ファイルが大きい場合に多くのメモリを消費することです。あなたの状況ではそれが問題になる可能性はありますか?代替案には次のようなものがあります。
- を使用する代わりにファイルに書き込む
MemoryStream
. 。もちろん、後でファイルをクリーンアップする必要があります - 基本的にファイルシステムをより大きなメモリとして使用しています:) - チャンク転送エンコーディングを使用して「チャンクを読み取り、チャンクを書き込む」。これ 5月 正しく理解するのは面倒ですが、これは私が以前にやったことではないことは確かです。
所属していません StackOverflow