2

500 MB のテキスト ファイルを読み取って、HttpWebRequest を介してコンテンツを送信しようとしています。私の要件によれば、データをチャンクで送信することはできません。コードは次のとおりです。

using (StreamReader reader = new StreamReader(filename))
{
    postData = reader.ReadToEnd();
}

byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "text/plain";
request.ContentLength = byteArray.Length;

Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();

WebResponse response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);

dataStream = response.GetResponseStream();

using (StreamReader reader = new StreamReader(dataStream))
{
    responseFromServer = reader.ReadToEnd();
}

Console.WriteLine(responseFromServer);
dataStream.Close();
response.Close();

このような大きなファイルを読み取ると、メモリ不足の例外が発生します。これを行う方法はありますか?

4

2 に答える 2

1

すべてのファイルはチャンクで転送されます。これがイーサネット パケットです。それはデータの単一のチャンクです。この要件は、「このファイルを 1 回の Web サービス呼び出しで転送する必要がある」ことを意味するものであることに賭けたいと思います。

その場合、データをディスクから 64KB のバッファーに読み取り、そのバッファーを要求に書き込みます。

request.ContentType = "text/plain";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
int BUFFER_SIZE = 65536;
byte[] buffer = new byte[BUFFER_SIZE];
using (StreamReader reader = new StreamReader(filename)) {
    int count = 0;
    while (true) {
        int count = reader.Read(buffer, 0, BUFFER_SIZE);
        dataStream.Write(buffer, 0, count);
        if (count < BUFFER_SIZE) break;
    }
}
dataStream.Close();
于 2012-07-24T23:50:48.920 に答える
1

でこの文書化された問題HttpWebRequestが発生している可能性があります。KB 記事に従って、HttpWebRequest.AllowWriteStreamBufferingプロパティを に設定してみてくださいfalse

于 2012-07-24T23:51:04.490 に答える