asp.net: Веб сервис и асинхронность
От: nakysyku  
Дата: 24.01.11 18:34
Оценка:
Добрый день.

Есть сайт с которого можно забирать информацию только залогинившись, причем одновременно
под одним логином может быть только одна сессия.

До сего времени существовал вебсервис который по запросу своего клиента лез на этот сайт с единственным логином скачивал что нужно( довольно длительная операция — до 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)Не забыть удалить сессию
Re: asp.net: Веб сервис и асинхронность
От: Ziaw Россия  
Дата: 24.01.11 20:12
Оценка:
Здравствуйте, nakysyku, Вы писали:

N>Добрый день.


N>Есть сайт с которого можно забирать информацию только залогинившись, причем одновременно

N>под одним логином может быть только одна сессия.

N>До сего времени существовал вебсервис который по запросу своего клиента лез на этот сайт с единственным логином скачивал что нужно( довольно длительная операция — до 10 минут ), а потом отдавал своему клиенту. Все эти действия блокировались с помощью Application.Lock / Unlock, поэтому если к сервису обращались другие клиенты — они ждали пока первый клиент закончит работу.


В рамках запроса длительные операции противопоказаны. Обычно делается так: клиент дает длинную задачу, задача отдается на выполнение стороннему сервису (job в БД, системная служба). Клиенту возвращается идентификатор этой задачи (например ключ записи в БД с параметрами джоба и статусом). Время от времени клиент спрашивает сервер, что там с задачей, после уведомления о выполнении начинает закачку.

Вобщем у сервиса будут три метода: поставить в очередь, получить состояние таска и скачать результат его выполнения. Остальная логика находится на клиенте.
Re[2]: asp.net: Веб сервис и асинхронность
От: nakysyku  
Дата: 24.01.11 21:16
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, nakysyku, Вы писали:


N>>Добрый день.


N>>Есть сайт с которого можно забирать информацию только залогинившись, причем одновременно

N>>под одним логином может быть только одна сессия.

N>>До сего времени существовал вебсервис который по запросу своего клиента лез на этот сайт с единственным логином скачивал что нужно( довольно длительная операция — до 10 минут ), а потом отдавал своему клиенту. Все эти действия блокировались с помощью Application.Lock / Unlock, поэтому если к сервису обращались другие клиенты — они ждали пока первый клиент закончит работу.


Z>В рамках запроса длительные операции противопоказаны. Обычно делается так: клиент дает длинную задачу, задача отдается на выполнение стороннему сервису (job в БД, системная служба). Клиенту возвращается идентификатор этой задачи (например ключ записи в БД с параметрами джоба и статусом). Время от времени клиент спрашивает сервер, что там с задачей, после уведомления о выполнении начинает закачку.


Z>Вобщем у сервиса будут три метода: поставить в очередь, получить состояние таска и скачать результат его выполнения. Остальная логика находится на клиенте.


Проблемма в том, что клиент это тоже сайт который должен вернуть от вет клиенту (браузеру). Понятно что можно все это в конечном счете свисти к опросам сайта через ajax, сайт при этом будет передовать запрос вебСервису. Но как то очень длинная цепочка.

То что длительные операции противопоказаны — это понятно, но я так понимаю что как раз для этих случаев существует IAsyncHttpHandler. Только вот как его правильно готовить ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.