WCF Настройка сервера для запоминания данных - PullRequest
3 голосов
/ 17 мая 2011

В настоящее время у меня есть служба в WCF, где она обрабатывает запросы, сделанные клиентом.Однако он кэширует некоторые данные, которые клиент отправляет.Затем он выполняет вычисления с данными.

В любой момент клиент должен иметь возможность получить некоторые данные.Это на усмотрение пользователя (при нажатии кнопки AJAX-запрос отправляется для получения некоторых данных).

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

Мне было интересно, как я могу решить это.Я пытался использовать сеансы, так как я искал способ создания экземпляра своего «объекта сервера» для каждого клиента, который хочет к нему подключиться.Все еще не повезло.

Этот вопрос связан с этим: WCF Закрытие соединения / Освобождение ресурсов

Ответы [ 2 ]

2 голосов
/ 18 мая 2011

Звучит так, как будто вы ищете услугу длительного пользования WCF ( ссылка ).Durable services может поддерживать состояние между вызовами к сервису.

Глава 4 в Программировании WCF Juval Lowy's Services ( link ) также содержит информацию о Durable Services, а также об услугах за сеанс, которые могут такжеhelp.

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

0 голосов
/ 18 мая 2011

Как настроена ваша служба в отношении создания экземпляров / параллелизма?Похоже, вы, возможно, используете экземпляр службы singleton и храните данные в экземпляре службы?

Если это так, это объясняет вашу проблему - это состояние будет перезаписано следующим клиентом, который вызовет операцию изменения состояния.

Поскольку ваш клиент является веб-браузером, вы, вероятно, используете webHttpBinding, который не поддерживает сеансы WCF.

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

Если вы хотите немного усложниться, вы можете исследовать возможность получения информации о cookie-файлах из запросов WCF и использовать ее для своего сеанса.

Наиболее сложным решением является использование настраиваемой привязки WCF, поддерживающей концепцию сеанса WCF (построенной на основе либо файлов cookie, либо параметров сеанса).Вероятно, не стоит усилий, если вы не можете найти готовое решение для Google.

...