2011-08-13 13 views
0

私はこの問題を劇的に変更しましたが、ここではそれが続きます。私はすべてがうまくいくIPカムからmjpegストリームを読んでいます。しかし、今私が受け取るすべてのフレーム(stream_NewFrameを参照)に、このイメージをクライアントにプッシュしたいと思います。しかし、私はHttpContext.Currentにアクセスする方法を把握していないように見えます。誰かがHttpContextコンテキストにアクセスする方法を知っていますか?ProcessRequest関数の内部で行うことができますか?私はここに明白な何かが不足していると思うが、私は何を理解することができない!あなたの時間をありがとう。ashxハンドラ、void内のHttpContext.Currentにアクセス

public class ImageHandler : IHttpHandler, IRequiresSessionState 
{ 

    public void ProcessRequest(HttpContext context) 
    { 

     //Get parameter 
     string Url = context.Request.QueryString["url"]; 
     string Username = context.Request.QueryString["username"]; 
     string Password = context.Request.QueryString["password"]; 

     //Set cache 
     HttpResponse Response = HttpContext.Current.Response; 
     Response.Expires = 0; 
     Response.Cache.SetCacheability(HttpCacheability.NoCache); 
     Response.ContentType = "multipart/x-mixed-replace"; 

     // create MJPEG video source 
     MJPEGStream stream = new MJPEGStream(string.Format("{0}/video.cgi?user={1}&pwd={2}", Url, Username, Password)); 
     stream.NewFrame += new NewFrameEventHandler(stream_NewFrame); 
     stream.Start(); 

    } 


    private void stream_NewFrame(object sender, NewFrameEventArgs eventArgs) 
    { 
     Image img = eventArgs.Frame; 
     byte[] b = GetImageBytes(eventArgs.Frame); 
     HttpContext.Current.Response.OutputStream.Write(b, 0, b.Length); 

    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 

} 

答えて

1

なぜあなたはちょうどそれがstream_NewFrameメソッドからアクセス可能ですので、離れsometwhere HttpContextを保存しませんか?あなたのクラスでメンバー変数を使用することをお勧めします。

それ以上カプセル化したい場合は、HttpContextにフィードする別のクラスを作成し、そのクラスにstream_NewFrameメソッドを代入します。ような何か:

class Processor 

     private HttpContext _context; 

     public Processor(HttpContext context) { 
      _context = context; 
     } 

     public void stream_NewFrame(object sender, NewFrameEventArgs eventArgs) 
     { 
      Image img = eventArgs.Frame; 
      byte[] b = GetImageBytes(eventArgs.Frame); 
      HttpContext.Current.Response.OutputStream.Write(b, 0, b.Length); 
     } 
} 

してからProcessRequestに、あなたがこのように実行します。

パブリッククラスImageHandler:IHTTPハンドラ、IRequiresSessionStateは {

public void ProcessRequest(HttpContext context) 
{ 

    //Get parameter 
    string Url = context.Request.QueryString["url"]; 
    string Username = context.Request.QueryString["username"]; 
    string Password = context.Request.QueryString["password"]; 

    //Set cache 
    HttpResponse Response = HttpContext.Current.Response; 
    Response.Expires = 0; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ContentType = "multipart/x-mixed-replace"; 

    // create processor 
    Processor p = new Processor(context);  

    // create MJPEG video source 
    MJPEGStream stream = new MJPEGStream(string.Format("{0}/video.cgi?user={1}&pwd={2}", Url, Username, Password)); 
    stream.NewFrame += new NewFrameEventHandler(p.stream_NewFrame); 
    stream.Start(); 

} 
0

MJPEGStreamは、それが動作することをバックグラウンドスレッドを作成し、 。 HTTPContext.Currentはスレッドローカル変数です。つまり、バックグラウンドスレッド(stream_newFrameコールバック関数を呼び出すスレッド)が別のスレッド上にあるため、同じHTTPContextはありません)。他の方法でそれを提供する必要があります。 Erikのように参照を保持するProcessorオブジェクトを作成するという考えはうまくいくはずです。

関連する問題