jQuery, WCF и ASP.NET

Извиняюсь, если это тупой вопрос. В предыдущих проектах ASP.NET я использовал jQuery для взаимодействия с веб-сервисом ASMX без проблем, включая возможность включения взаимодействия с состоянием сеанса пользователя.

Сейчас я погружаюсь в мир Visual Studio 2010 и .NET 4.0 и пытаюсь сделать то же самое с сервисом WCF с поддержкой AJAX.

У меня есть основные принципы работы: у меня есть jQuery, передающий данные в вызов службы, он выполняет некоторую обработку и возвращает значение, которое jQuery отображает для пользователя.

У меня вопрос - как мне получить сервис WCF для доступа к информации о сеансе пользователя? У меня такое чувство, что мне не хватает чего-то довольно фундаментального в моем понимании WCF. Любые указатели будут оценены!

27.06.2009 01:07:58
2 ОТВЕТА
РЕШЕНИЕ

[обновление]: Вот и хорошая статья: http://blogs.msdn.com/drnick/archive/2008/10/08/working-with-session-state.aspx

Одна концепция, которая иногда сбивает с толку разработчиков ASP.NET при переходе на WCF, это понятие состояния сеанса. В обычных службах WCF все состояние сеанса хранится в локальной энергозависимой памяти. Прикладная программа должна выбрать копирование части состояния сеанса в долговременное хранилище для сохранения этого состояния в запущенных экземплярах. WCF не имеет встроенной опции для включения постоянного хранения состояния сеанса или доступа к состоянию сеанса из других процессов.

Есть несколько способов сделать WCF более похожим на ASP.NET.

Один из способов сделать WCF более похожим на ASP.NET - это сделать WCF точно таким же, как ASP.NET, включив режим совместимости ASP.NET. Приложение WCF, которое размещено в IIS и использует HTTP в качестве транспортной привязки, работает вместе с конвейером ASP.NET, но не имеет доступа ко многим функциям ASP.NET. Включение режима совместимости интегрирует приложение WCF с конвейером ASP.NET и делает доступными многие из этих функций. Очевидно, что этот подход интересен только тогда, когда ваша служба WCF уже очень похожа на приложение ASP.NET.

Другой способ сделать WCF более похожим на ASP.NET - изменить управление состоянием сеанса WCF, чтобы использовать удаленное долговременное хранилище, а не локальную энергозависимую память. Этот подход больше похож на тот, который используется сервисами рабочих процессов для создания надежных приложений. Управление экземплярами службы и контекстами экземпляра контролируется IInstanceProvider, который создает и уничтожает объекты службы, IInstanceContextProvider, который создает и уничтожает контексты экземпляра, и IInstanceContextInitializer, который устанавливает вновь полученные контексты экземпляра. Хотя долгосрочные службы имеют другую семантику, чем состояние сеанса, существуют общие строительные блоки, которые могут использоваться для обоих. [/Обновить]

В дополнение к вышесказанному я могу предложить вам несколько вещей. Взгляните на этот пост для одного из них: https://stackoverflow.com/questions/275926/wcf-data-presistence-between-sessions . Далее рассмотрим использование какой-либо формы кеша. Это может быть служба стиля кеша или ферма кеша. Подробнее о кэшировании читайте в моем посте здесь: System.Web.Caching vs. Enterprise Library Caching Block

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

6
23.05.2017 12:34:00
Спасибо за Ваш ответ!! Судя по всему - для моих целей - не лучше ли мне придерживаться веб-службы ASMX? Сервис существует только для поддержки пользовательского интерфейса веб-приложения через AJAX, поэтому требуется жесткий и регулярный доступ к сеансу ASP.NET пользователя. В чем преимущество использования WCF в моих обстоятельствах? Еще раз спасибо!
Chris Roberts 27.06.2009 08:02:48
@Chris Roberts - Если цель состоит только в том, чтобы поддерживать пользовательский интерфейс и никогда не станет публичным API, тогда да - вы можете придерживаться ASMX. Я могу придумать пару причин, чтобы использовать WCF. Он более производительный и предоставляет множество способов связи с ним в случае, если клиент службы меняется со временем. Еще одна хорошая причина использовать WCF - делать то, что у вас уже есть - узнать, как работает WCF (а в вашем случае не работает!).
Andrew Siemer 27.06.2009 16:23:06

Хорошо, так что, вероятно, было слишком поздно ночью, когда я отправил свой оригинальный вопрос! Состояние сеанса ASP.NET пользователя представляется доступным из кода службы в обычном месте, а именно - HttpContext.Current.Session.

2
27.06.2009 15:45:41
Это доступно в вашем компоненте WCF ??
Tad Donaghe 29.06.2009 16:43:08
Кажется, aspNetCompatibilityEnabled="true"это установлено по умолчанию.
Niels Brinch 22.08.2012 05:59:48
@Niels: Это правильно, если у вас есть служба WCF с поддержкой Ajax, тогда вы добавляете System.Wet для доступа к HttpContext.Current.Session
mas_oz2k1 19.04.2013 03:29:37