Есть сайт с которого можно забирать информацию только залогинившись, причем одновременно
под одним логином может быть только одна сессия.
До сего времени существовал вебсервис который по запросу своего клиента лез на этот сайт с единственным логином скачивал что нужно( довольно длительная операция — до 10 минут ), а потом отдавал своему клиенту. Все эти действия блокировались с помощью Application.Lock / Unlock, поэтому если к сервису обращались другие клиенты — они ждали пока первый клиент закончит работу.
Сейчас появилась необходимость использовать второй, третий и.т.д. логины.
В общем я вижу картинку так: есть некий обьект-"процессор" — который держит список доступных соединений ( каждое соединение со своим логином ) и очередь обьектов-
запросов. Процессор раздает освобождающиеся соединения запросам стоящим в очереди.
Если более подробно, то я представляю так: Есть асинхронный сервис. в BeginRequest() Я создаю обьект запроса и добовляю его в очередь "процессора", в EndRequest() я отдаю клиенту сервиса обработанный запрос.
А вот что я представить не могу — Это где должен "жить" "Процессор" — в отдельном потоке ? И как он должен узнавать что появилось свободное соединение ? — в цикле опрашивать соединения свободны ли они ?
Я не имел дела с асинхронным программированием, поэтому совсем запутался. Буду благодарен за любые советы и идеи.
Re: asp.net: Веб сервис и асинхронность
От:
Аноним
Дата:
24.01.11 18:52
Оценка:
Здравствуйте, nakysyku, Вы писали:
1)Аутентификация клиента — свой\чужой.
2)Создать и сохранить его сессию, отдать ему идентификатор(LoginName or LoginId or Guid...)
3)Установить сесии время жизни
4)Все последующие вызовы проверяют идентификатор сессии — пре-условие
4)Пришел запрос — получил ответ что задание выполняется
5)Клиент опрашивает по таймеру об окончании
6)Получает ответ
7)Не забыть удалить сессию
Здравствуйте, nakysyku, Вы писали:
N>Добрый день.
N>Есть сайт с которого можно забирать информацию только залогинившись, причем одновременно N>под одним логином может быть только одна сессия.
N>До сего времени существовал вебсервис который по запросу своего клиента лез на этот сайт с единственным логином скачивал что нужно( довольно длительная операция — до 10 минут ), а потом отдавал своему клиенту. Все эти действия блокировались с помощью Application.Lock / Unlock, поэтому если к сервису обращались другие клиенты — они ждали пока первый клиент закончит работу.
В рамках запроса длительные операции противопоказаны. Обычно делается так: клиент дает длинную задачу, задача отдается на выполнение стороннему сервису (job в БД, системная служба). Клиенту возвращается идентификатор этой задачи (например ключ записи в БД с параметрами джоба и статусом). Время от времени клиент спрашивает сервер, что там с задачей, после уведомления о выполнении начинает закачку.
Вобщем у сервиса будут три метода: поставить в очередь, получить состояние таска и скачать результат его выполнения. Остальная логика находится на клиенте.
Здравствуйте, Ziaw, Вы писали:
Z>Здравствуйте, nakysyku, Вы писали:
N>>Добрый день.
N>>Есть сайт с которого можно забирать информацию только залогинившись, причем одновременно N>>под одним логином может быть только одна сессия.
N>>До сего времени существовал вебсервис который по запросу своего клиента лез на этот сайт с единственным логином скачивал что нужно( довольно длительная операция — до 10 минут ), а потом отдавал своему клиенту. Все эти действия блокировались с помощью Application.Lock / Unlock, поэтому если к сервису обращались другие клиенты — они ждали пока первый клиент закончит работу.
Z>В рамках запроса длительные операции противопоказаны. Обычно делается так: клиент дает длинную задачу, задача отдается на выполнение стороннему сервису (job в БД, системная служба). Клиенту возвращается идентификатор этой задачи (например ключ записи в БД с параметрами джоба и статусом). Время от времени клиент спрашивает сервер, что там с задачей, после уведомления о выполнении начинает закачку.
Z>Вобщем у сервиса будут три метода: поставить в очередь, получить состояние таска и скачать результат его выполнения. Остальная логика находится на клиенте.
Проблемма в том, что клиент это тоже сайт который должен вернуть от вет клиенту (браузеру). Понятно что можно все это в конечном счете свисти к опросам сайта через ajax, сайт при этом будет передовать запрос вебСервису. Но как то очень длинная цепочка.
То что длительные операции противопоказаны — это понятно, но я так понимаю что как раз для этих случаев существует IAsyncHttpHandler. Только вот как его правильно готовить ...