Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Web Service, DCOM сервер и многия клиенты


Skyle ©   (2005-07-06 07:03:00) 

Есть такая задача. Имеется унаследованный сервер DCOM. Нужно написать Web Service, который будет шлюзовать запросы клиентов к этому самому серверу. Клиенты написаны на C#.

Создал interop, вкрутил в сервис, создал пару тестовых WebMethod'ов, из которых он обращается, всё вроде в ажуре.

Проблем несколько.
1. Аутентификация.
Пробовал решить через строку
<identity impersonate="true" userName="DOMAIN\USER" password="superpass"/> в web.config этого WebServicer'а. Вроде бы работает, но почему-то не всегда.
Я правильно понимаю, что под указанной учётной записью будет исполняться мой WebService и обращение к DCOM серверу будет именно под этой учётной записью (т.е. ей нужно раздать достаточные права в dcomcnfg на машине с DCOM сервером)?

2. Сохранение коннекта.
Видимо по умолчанию WebService находится в stateless mode, т.е. не держит сессии (cookies клиенты принимать умеют и это у них разрешено). Поэтому при каждом вызове каждого метода создаётся коннект к серверу (новый экземпляр). Видимо это новый экземпляр WebService'а. Пробовал создавать экземпляр DCOM сервера и хранить его в объекте Application. Работает, но решение видится очень кривым.
Вопрос в том, как заставить сервис держать сессии.

Есть и ещё вопросы, но это основное...

P.S. WebService пока написан в VS .NET 2003, но возможно будет написан на D7. Думаю ответы на эти вопросы одинаковы в обоих случаях.

Интересуют либо прямые ответы, либо ссылки на соответствующие доки либо просто накидать умных слов, чтобы я сам поискал...


Skyle   (2005-07-06 14:23:00) [1]

Всем спасибо, буду делать пул.


Polevi   (2005-07-06 11:55:00) [2]

http://msdn.microsoft.com/msdnmag/issues/03/12/leasemanager/default.aspx?fig=true#fig7


Игорь Шевченко   (2005-07-06 11:54:00) [3]


> А что за спонсоры? Как в оригинале называется?


Так и называются


Skyle   (2005-07-06 10:52:00) [4]


> [4] Игорь Шевченко ©   (06.07.05 09:55)
> > Видимо по умолчанию WebService находится в stateless mode
> А в webconfig посмотреть в сторону параметра sessionState
> не поможет ?

Посмотрел, написано, что сессии включены (cookieless = FALSE)...


Skyle   (2005-07-06 10:51:00) [5]

> насчет lifetime можешь копнуть в сторону спонсоров

А что за спонсоры? Как в оригинале называется?


Polevi   (2005-07-06 10:01:00) [6]

честно говоря могу ощибаться, но EnableSession это когда объект Session сериализуется и передается при каждом request-response
тебе же требуется хранить в памяти сервера двоичный объект
вариант с пулом вполне нормальный
насчет lifetime можешь копнуть в сторону спонсоров


Игорь Шевченко   (2005-07-06 09:55:00) [7]


> Видимо по умолчанию WebService находится в stateless mode


А в webconfig посмотреть в сторону параметра sessionState не поможет ?


Skyle   (2005-07-06 09:45:00) [8]

> stateless - это природа WebServices.
Т.е. никак его не заставить чтоли?
А как насчёт [WebMethod(EnableSession=true)]?
Насколько я понял, это именно включение сессий (т.е. раздаются cookies, объект Session живёт и может хранить данные между соединениями), но вот у меня это не заработало.


> [2] Polevi ©   (06.07.05 09:25)
> если DCOM сервер statefull придется тебе держать ссылку,
> ничего не поделаешь

Где держать-то?
Глобально, как я и писал (одна на всех в Application) или всё-таки умудриться запустить сессии?

Можно попробовать в Application сделать какой-нибудь пул, например имя объекта - уникальный гуид логической сессии клиента.
Если не запущу сессии, видимо так и придётся работать...:(

И ещё вопрос...
Допустим, у меня на каждое обращение создаётся экземпляр DCOM сервера со всеми вытекающими (коннект и прочее). Как эти коннекты отрубать?
Казалось бы достаточно просто уничтожить объект в сервисе, но не тут то было.

Насколько я понял привычным образом аля Excel.Quit; Excel := UnAssigned; тут не поступишь. Приходится отдаваться на милость GC? Или всё-таки есть способы его погасить руками?

В общем, чего-то я здесь простого не догоняю видимо...


Polevi   (2005-07-06 09:25:00) [9]

если DCOM сервер statefull придется тебе держать ссылку, ничего не поделаешь


iZEN   (2005-07-06 08:44:00) [10]

stateless - это природа WebServices.


Наверх

Титульная страница Поиск, карта сайта Написать письмо