2011-08-13 24 views
0

我已经戏剧性地改变了这个问题,但它在这里。我正在从IP摄像机读取mjpeg流,一切正常。但现在在我接收到的每一帧中(请参阅stream_NewFrame),我想将此图像推送给客户端。但我似乎无法弄清楚如何访问HttpContext.Current导致它在该函数中始终为空。有没有人知道如何访问HttpContext上下文,就像我可以在ProcessRequest函数中一样?我想在这里我错过了一些明显的东西,但我无法弄清楚什么!感谢您的时间。ashx处理程序,访问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

你为什么不只是保存HttpContext远sometwhere所以它从stream_NewFrame方法访问?我会建议在你的类中使用一个成员变量。

如果您想要封装更多的内容,请创建一个单独的类,将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: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 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这样的引用的想法应该很好。