2011-08-13 3 views
0

나는이 질문을 극적으로 바꿨지만, 여기에 간다. 나는 모든 것이 잘되는 IP 캠에서 mjpeg 스트림을 읽고있다. 그러나 이제는 모든 프레임에서 (stream_NewFrame 참조)이 이미지를 클라이언트에 전달하려고합니다. 하지만 HttpContext.Current 액세스하는 방법을 알아낼 수가 없어 항상 그 함수 안에 null. 누구든지 ProcessRequest 함수 내부에서 할 수있는 것처럼 HttpContext 컨텍스트에 액세스하는 방법을 알고 있습니까? 나는 명백한 무엇인가 여기에서 놓치고있다. 그러나 나는 무엇이 있는지에 관해 이해할 수 없다! 시간 내 주셔서 감사합니다.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 방법을 넣어하려는 경우. 뭔가 같이 : 당신의 ProcessRequest에서 다음

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

, 당신은 다음과 같이 수행

공용 클래스 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)과 같이 참조를 유지할 프로세서 객체를 만드는 아이디어는 잘 작동해야합니다.

관련 문제