Обработчик Ashx, доступ HttpContext.Current внутри пустоты - PullRequest
0 голосов
/ 13 августа 2011

Я резко изменил этот вопрос, но здесь он идет.Я читаю поток mjpeg с IP-камеры, и все идет хорошо.Но теперь на каждом кадре, который я получаю (см. Stream_NewFrame), я хочу передать это изображение клиенту.Но я не могу понять, как получить доступ к HttpContext.Current, потому что внутри этой функции он всегда равен нулю.Кто-нибудь знает, как получить доступ к контексту HttpContext так же, как я могу сделать внутри функции ProcessRequest?Мне кажется, здесь что-то не хватает очевидного, но я не могу понять, что!Спасибо за ваше время.

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

}

Ответы [ 2 ]

1 голос
/ 14 августа 2011

Почему бы вам просто не сохранить куда-нибудь HttpContext, чтобы он был доступен из метода 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 голосов
/ 15 августа 2011

MJPEGStream создает фоновый поток, над которым он работает.HTTPContext.Current является локальной переменной потока, что означает, что фоновый поток (который является потоком, который вызывает функцию обратного вызова stream_newFrame), находится в другом потоке, поэтому он не имеет тот же HTTPContext (вфакта его нету).Вам нужно будет предоставить это другим способом.Идея создания объекта Processor для хранения ссылки, как предложил Эрик, должна работать хорошо.

...