0

POST リクエストを作成してファイルをサーバーにアップロードする次のコードがあります。

string fileName = @"C:\Console_sk.txt";

HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create("http://" + Environment.MachineName + ":8000/Upload");
request.Method = "POST";
request.ContentType = "text/plain";
request.AllowWriteStreamBuffering = false;

Stream fileStream = new FileStream(fileName, FileMode.Open);
request.ContentLength = fileStream.Length;

Stream serverStream  = request.GetRequestStream();

byte[] buffer = new byte[4096];
while (true)
{
    int bytesRead = fileStream.Read(buffer, 0, buffer.Length);
    if (bytesRead > 0)
    {
        serverStream.Write(buffer, 0, bytesRead);     
    }
    else
    {
        break;
    }
}

serverStream.Close();
fileStream.Close();

request.GetResponse();

これは、潜在的に大きなファイルをアップロードするために使用されるため、このアップロードの進行状況を追跡することが不可欠です。

さまざまなソースに基づいて、私のコードは 4096 バイトのチャンクでファイルをアップロードする、つまり複数の POST リクエストが行われると考えました。しかし、Fiddler を使用して要求を追跡すると、1 つの POST 要求のみが行われることが示されます。一方、.NET ネットワーク トレースを有効にすると、結果のログは、4096 バイトのチャンクが実際に要求ストリームに書き込まれ、書き込み操作ごとにソケットが常に開かれていることを示しました。

ネットワーキング全般についての私の理解はかなり乏しいので、これが実際にどのように機能するのかよくわかりません。を呼び出すときserverStream.Write、提供されたチャンクは実際にネットワーク経由で送信されますか、それともどこかにバッファリングされているだけですか? が呼び出されたときにserverStream.Close、ファイル全体がアップロードされたことを確認できますか?

4

1 に答える 1

2

HttpWebRequestクラスは単一のHTTP要求を送信します。あなたがしていることは、ファイル全体をメモリにロードすることを避けるために、チャンクでリクエストに書き込むことです。ファイルから読み取り、4KB のチャンクで要求ストリームに直接書き込みます。

serverStream.Write を呼び出すとき、提供されたチャンクは実際にネットワーク経由で送信されますか?

はい、ネットワークソケットに書き込まれます。

于 2012-04-17T08:56:06.853 に答える