2011-12-07 20 views
0

背景: GPRSデバイスの1つにプロキシを介して汎用ハンドラを接続する際に問題が発生しています。ハンドラは戻り直後に接続を終了しますが、プロキシはデバイスが予期しない接続を開いたままにします。HttpHandlerを生存/維持する中間データを維持する

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

例えば、これはない作業を行います。

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; 
     } 
    } 
} 

[編集]

を期待通りに[OK]を、実際に、それが動作します。問題は、FirefoxとFiddlerの両方が、接続が閉じられるまで未処理のデータを表示するのを遅らせることです。

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

答えて

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(); 

実は、これは結局うまく動作Best way to stream files in ASP.NET

+0

ありがとうございました。それは私が実際にこのようにする必要はないことが判明しましたが、あなたの提案はそれにもかかわらず機能しました。結局のところ、単純なフラッシュが期待どおりに機能するようです。 – Groo

+0

Wickedが助けてうれしい! –

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); 
    } 
} 

私が接続するためのターミナルプログラムを使用していたが、それがOKであることが判明しました。言及すべき

一つは、データが送信される方法を変更する、ASPは、この場合Transfer-Encoding: chunkedヘッダを付加することである:

ように、各チャンクのサイズが適切チャンク自体の前に送信されます クライアントは、そのチャンクのデータの受信が完了したことを通知できます。 データ転送は、長さ0の最終チャンクで終了します。

関連する問題