none
IHttpAsyncHandler + асинхронный запрос через WebRequest RRS feed

  • Вопрос

  • Пытаюсь сделать в асинхронном обработчике запрос  асинхронный запрос, так чтобы поток обработки запросов нигде не блокировался

    Получилось примерно так:

    public

    class Handler2 : IHttpAsyncHandler

    {

       public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)

       {

          var Request = WebRequest.Create(

    "http://localhost/test/test.html");

          Request.Method =

    "GET";

          Request.Timeout = 10000;

          return Request.BeginGetResponse(null, null);

       }

       public void EndProcessRequest(IAsyncResult result)

       {

       }

    }

    Но в обработчик EndProcessRequest так и не приходит. Подскажите как правильно сделать?

    6 августа 2012 г. 12:01

Ответы

  • Так метод EndProcessRequest выполняется после окончания обработки запроса обработчиком. А чтобы поймать и обработать событие вашего запроса

    return Request.BeginGetResponse(null, null);

    нужно передать адрес функции (первый параметр AsyncCallback callback, ) которая будет его обрабатывать, а у Вас нет функции, Вы передаёте null. EndProcessRequest никакого отношения не имеет к Request.BeginGetResponse.

    • Изменено YatajgaEditor 6 августа 2012 г. 12:31
    • Помечено в качестве ответа kidar2 7 августа 2012 г. 6:34
    6 августа 2012 г. 12:30
    Модератор

Все ответы

  • Так метод EndProcessRequest выполняется после окончания обработки запроса обработчиком. А чтобы поймать и обработать событие вашего запроса

    return Request.BeginGetResponse(null, null);

    нужно передать адрес функции (первый параметр AsyncCallback callback, ) которая будет его обрабатывать, а у Вас нет функции, Вы передаёте null. EndProcessRequest никакого отношения не имеет к Request.BeginGetResponse.

    • Изменено YatajgaEditor 6 августа 2012 г. 12:31
    • Помечено в качестве ответа kidar2 7 августа 2012 г. 6:34
    6 августа 2012 г. 12:30
    Модератор
  • Спасибо. То что не имеет отношения я понимаю. Подсказка с callback'ом помогла.

    А вот еще небольшой вопросик: в какой все-таки момент отправляется ответ на клиент? Когда вызывается EndProcessRequest (причем вручную)? Как это отслеживает asp.net ?

    7 августа 2012 г. 6:33
  • Когда приходит запрос, запускается функция BeginProcessRequest с параметром делегата AsyncCallback cb, который нужно передать асинхронной функции xxxBeginxxx (Ваш случай Request.BeginGetResponse) который и выполняет асинхронную обработку запроса в отдельном потоке, чтобы при завершении иметь возможно вызвать функцию завершения обработки (EndProcessRequest). Если не передать делегат cb, то обратный вызов не произойдёт (не запустится EndProcessRequest) и запрос просто зависнет, хотя асинхронная операция завершится успешно.

    "А вот еще небольшой вопросик: в какой все-таки момент отправляется ответ на клиент?" - после выполнения асинхронной операции, когда отработает метод EndProcessRequest.

    "Когда вызывается EndProcessRequest (причем вручную)? Как это отслеживает asp.net ?" - думаю уже из высшеизложенного понятно когда. А ответ Вы пзаписываете в HttpContext contex, во время выполнения асинхронной операции. Но в вашем случае это невозможно, так как функция Request.BeginGetResponse не ваша.

    7 августа 2012 г. 8:45
    Модератор