1

WinForms アプリケーションから HTTP PUT 要求を送信しています。PUT データが到着すると、メッセージをデータベースに書き込むページに PUT データをゆっくりと送信したいと考えています。私は WebRequest を使用していて、SendChunked を true に設定しましたが、8KB のデータが要求ストリームに書き込まれた後にのみチャンクを送信するようです。

さらに悪いことに、Web ページは約 42KB で受信を停止したように見え、送信者は約 77KB で WebException をスローし、「リクエストは中止されました: リクエストはキャンセルされました」というメッセージが表示されます。

私は実際には各メッセージで非常に少量のデータを送信しているので、WebRequest が各メッセージを含む小さなチャンクを送信するように説得できれば、問題ありません。

これが私がこれまでに実験しているものです:

var request = 
    (HttpWebRequest)WebRequest.Create("http://localhost/test.php");

request.Method = "PUT";
request.Timeout = 300 * 1000;
request.SendChunked = true;
request.AllowWriteStreamBuffering = false;
request.ContentType = "application/octet-stream";
using (var post = new StreamWriter(request.GetRequestStream()))
{
    post.AutoFlush = true;
    for (int i = 0; i < 100; i++)
    {
        if (i > 0)
        {
            // force flushing previous chunk
            post.Write(new String(' ', 1048));
            Thread.Sleep(2 * 1000);
        }
        Console.Out.WriteLine("Requesting {0} at {1}.", i, DateTime.Now);
        string chunk = i.ToString();
        post.WriteLine(i);
    }
}

各メッセージの後に 1 KB の空白を書き込んで、WebRequest がより早くチャンクを送信するように強制します。

4

2 に答える 2

1

誰もこれ以上エレガントな提案を持っていない場合は、生のソケットを開いて自分でチャンク エンコーディングを実装できると思います。この回答には合理的な説明があります。

于 2010-10-15T23:24:33.827 に答える
1

あなたの質問を正しく理解できれば、単一の PUT リクエストを発行してください。リクエストの一部として、チャンク データを送信する必要があり、サーバーが確認した各チャンクに対してアクションを実行する必要があります。

HttpWebRequest を使用することで、これが非常に簡単に可能になるとは思いません。お気づきのように、HWR はチャンク データを送信しますが、チャンクの正確な開始位置と終了位置を制御することはできません。

次に、Don が示唆するようにカスタム Socket 実装を作成することによってクライアント側を引き離すことができたとしても、ウェブサーバーが受信するチャンクごとにアプリに制御を与えることを保証することはできません。Web サーバーは、いくつかのチャンクをバッファリングし、それらすべてを同時にアプリに渡すことを決定する場合があります。

設計を再考し、要求とデータがサーバーが実行する必要があるアクションを構成する単純な要求/応答ベースのモデルを用意することをお勧めします。

于 2010-10-16T19:25:45.373 に答える