2010-05-05 2 views
1

Сценарий: У меня есть приложение PRISM, разработанное в Silverlight (4), и я использую приложение на стороне сервера ASP.NET для размещения нескольких веб-сервисов (которые , в свою очередь, обращается к WCF-сервисам, но здесь это не очень важно). Приложение Silverlight должно иметь возможность вызвать междоменные веб-службы (это означает, что веб-службы не обязательно находятся на том же сервере, на котором размещается приложение silverlight).Использование состояния сеанса ASP.NET с помощью Silverlight (PRISM)

Приложение Silverlight состоит из нескольких модулей, каждый из которых обращается к веб-службам ASP.NET.

У меня нет большого опыта работы с Silverlight и PRISM, но, насколько я могу видеть, что это не очень необычный сценарий ...

Проблема: Мой Наша задача в том, что когда 2 различных модулей доступ к веб-сервисам, я получаю 2 новых сеанса на веб-сервере. Я бы подумал, что, поскольку оба модуля живут на одной и той же HTML-странице (а затем и в том же сеансе браузера), они получат один и тот же сеанс на веб-сервере ...?

Я попытался сделать веб-сервис прокси-клиента глобально доступным в контейнере (используя Unity), зарегистрировав экземпляр (используя Container.RegisterInstance), а затем получая этот экземпляр всякий раз, когда модуль должен создать веб-сайт -service (используя Container.Resolve), но это, похоже, не помогает.

Однако любые вызовы, сделанные в одном модуле, всегда получают один и тот же сеанс на сервере.

Может ли кто-нибудь увидеть, что мне здесь не хватает ...?

Спасибо!

Jon

ответ

1

Похоже, я нашел свой собственный ответ.

Проблема заключалась в том, что мое приложение запускало несколько вызовов веб-сервиса при запуске (различные PRISM-модули работают независимо). И когда было сделано несколько звонков, прежде чем какие-либо ответы были получены с веб-сервера, сеанс (и, следовательно, нет «cookie» ASP.NET_SessionId) был возвращен клиенту до того, как были сделаны последующие вызовы.

Мое решение было убедиться, что я делаю один вызов (асинхронная как всегда), например, к простой Ping, как веб-службы, а затем, удерживая все другие вызовы на веб-сервере, пока этот ответ не возвращается. Затем всем последующим вызовам присваивается тот же сеанс на сервере (потому что теперь все они содержат файл cookie «ASP.NET_SessionId» в заголовке).

В pratice этот вызов выполняется оболочкой PRISM, и модули не загружаются до того, как я получу ответ. Тогда я абсолютно уверен, что ни один из других модулей не получит триггеров, прежде чем у меня будет состояние сеанса.

Тем не менее, если кто-либо видит какие-либо другие проблемы с этим решением, я более чем рад услышать от вас.

Спасибо!

Jon

Смежные вопросы