2008-11-11 5 views
8

Я работаю над разделением уровня приложений и веб-уровня веб-приложения. В уровне приложения мне удалось разделить бизнес-логику на кучу сервисов, открытых с использованием прокси WCF. Проблема в том, что эти службы общаются с другим устаревшим приложением, которое использует большой объект CLR в качестве основного средства связи. Чтобы все было в порядке, я сохранил копию этого объекта в сеансе после того, как создал его в первый раз. Теперь я знаю, что WCF может выполнять сеансы, но хранилище сеансов - за услугу, тогда как моя бизнес-логика теперь разделена на несколько сервисов (как и должно быть).Обмен сеансом между службами WCF

Теперь вопросы:

  1. Есть ли способ совместного хранения сессии между WCF служб, размещенных на том же хосте?
  2. Это что-то, что я должен делать?
  3. Если нет, то какие здесь лучшие методы?

Возможно, это не первый случай, когда у кого-то был крупный бизнес-объект на сервере. К сожалению для меня, мне действительно нужно кэшировать этот объект для каждого пользователя (следовательно, сеанс).

Возможно, ответ очевиден, и я просто не вижу его. Помоги пожалуйста!

ответ

0

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

Все зависит от того, насколько велик объект и какие данные он хранит.

Если вы не хотите передавать объект, потому что он слишком велик, вы можете создать API запросов для службы, которая его получает. Таким образом, вы можете манипулировать этим объектом, не выполняя дорогостоящую сериализацию или удаленное перемещение.

1

Насколько я понимаю, WCF предназначен для того, чтобы быть как можно более безгражданством. В сеансе вы можете запомнить некоторые значения в своей службе, но объекты не предназначены для работы вне сферы действия сеанса.

Поэтому я думаю, что у вас проблемы.

Конечно, может быть какой-то способ хранения и обмена объектами между сеансами, которые я не знаю (я использую WCF, но я не очень-то знаю об этом, кроме того, что мне нужно для себя).

(если есть способ поделиться объектами между службами, он, вероятно, будет работать только на услуги размещенной себя. IIS хостинга может переработать ваш сервис иногда)

1

Возможно, вы можете обернуть этот объект в службе одноплодной. Это сервис с одним экземпляром, который не будет уничтожен между вызовами. Поскольку для каждого пользователя нужен объект, эта служба должна управлять списком из них, а вызывающие службы должны предоставлять необходимые данные аутентификации (или sessionid). Не забудьте тайм-аут, чтобы избавиться от ненужных объектов ...

1

Создайте facade service, в котором размещается большой объект CLR от имени других сервисов уровня приложения. Он может работать как adapter, позволяя использовать более конкретные идентификаторы сеанса для более продвинутых сервисов уровня приложения. Фасад может предоставить идентификатор сеанса, такой как GUID, который могут использовать ваши сервисы уровня приложения для повторного подключения к большому объекту CLR.

Это дает несколько преимуществ:

  1. Некоторые из вашего приложения уровня может не нужно знать об объекте CLR вообще. Они только общаются с удаленным фасадом.

  2. хост «большой объект CLR» сохраняет объект сеанса от имени других служб, которые теперь могут делиться им.

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

В зависимости от вашей установки вы можете разместить фасад через хостинг proc, который даст вам преимущество в производительности, которое вы ищете.

0

Держите его просто. Поскольку у вас уже есть доступ к сеансу в вашем WCF, вы можете использовать SessionID оттуда. В настоящее время:

  1. Создайте статический словарь где-нибудь, где ключ - ваш sessionId, а значение - это бизнес-объект, который вы хотите сохранить.

  2. Вместо доступа к бизнес-объекту в сеансе просто войдите в sessionid и получите бизнес-объект из значения вашего словаря.

(Вы также можете использовать некоторый тип кэширования, если вы хотите, например System.Web.Caching, таким образом, вы не должны очистки словарь вручную)

+0

Но как вы держите SESSIONID между службой звонки? вам понадобится этот сеанс в вашей руке, чтобы получить объект из словаря – liorafar 2012-12-05 09:10:50

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