0

背景: GPRS デバイスの 1 つがプロキシ経由で汎用ハンドラーに接続する際に問題が発生しています。ハンドラーは戻った直後に接続を閉じますが、プロキシは接続を開いたままにしますが、これはデバイスが予期していません。

私の質問:テスト目的で (プロキシの動作を模倣するため)、ハンドラーがデータを返した後、しばらくの間接続を維持することは可能ですか?

たとえば、これは機能しませ

public class Ping : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.BufferOutput = false;

        context.Response.ContentType = "text/plain";
        context.Response.WriteLine("HELLO");
        context.Response.Flush();  // <-- this doesn't send the data

        System.Threading.Thread.Sleep(10000);
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

[編集]

わかりました、実際には、期待どおりに動作します。問題は、Firefox と Fiddler の両方が、接続が閉じられるまで生データの表示を遅らせることです。

Response.BufferOutputに設定されてfalseいて、端末プログラムを使用して接続すると、データがすぐに取得され、接続が 10 秒間開いたままになります。

4

2 に答える 2

1

出力ストリームに書き込むことができ、これはあなたが望むことを行います。

byte [] buffer = new byte[1<<16] // 64kb
int bytesRead = 0;
using(var file = File.Open(path))
{
   while((bytesRead = file.Read(buffer, 0, buffer.Length)) != 0)
   {
        Response.OutputStream.Write(buffer, 0, bytesRead);
         // can sleep here or whatever
   }
}
Response.Flush();
Response.Close();
Response.End();

ASP.NET でファイルをストリーミングする最良の方法を確認してください

于 2011-12-07T10:46:23.493 に答える
0

実際、これは結局うまくいきます:

public class Ping : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.BufferOutput = false;

        context.Response.ContentType = "text/plain";
        context.Response.WriteLine("HELLO"); // <-- data is sent immediately

        System.Threading.Thread.Sleep(10000);
    }
}

接続には端末プログラムを使用する必要がありましたが、問題ないことがわかりました。

言及すべきことの 1 つは、ASP がTransfer-Encoding: chunkedこの場合にヘッダーを追加することです。これにより、データの送信方法が変更されます。

各チャンクのサイズは、チャンク自体の直前に送信されるため、クライアントはそのチャンクのデータの受信をいつ終了したかを知ることができます。データ転送は、長さゼロの最終チャンクで終了します。

于 2011-12-07T11:40:46.487 に答える