четверг, 23 апреля 2009 г.

Web-сервисы с сохранением состояния на ASP

При создании web-сервисов сложного поведения, бывает, требуется необходимость в сохранении его состояния от одного запроса к другому. Добиться этого можно двумя способами:
  • Использованием файлов/БД с передачей уникального ключа в каждом запросе;
  • Использованием сессий.
Второй вариант фактически есть упрощение первого, поэтому целесообразно рассматривать его и сразу. Решается этот вопрос аргументом EnableSession атрибута WebMethod:
[WebMethod( EnableSession = true )]
public int Echo( int _Val ) { ... }
При этом мы намекаем, что при вызове web-метода Echo имеет смысл предоставить сервером контексту севриса сессию, уникальную для клиента в определенный промежуток времени. Данный промежуток времени можно указать в web.config атрибутом timeout элемента sessionState. Чтобы сервер был в курсе, какую сессию предоставлять контексту сервиса - новую или одну из существующих - необходимо определить свойство CookieContainer данного web-сервиса:
mService.CookieContainer = new CookieContainer( );
От рассмотренного второго варианта решения вопроса можно перейти к первому. ASP позволяет хранить сессии в БД. Определить эту возможность можно при помощи упомянутого ранее элемента sessionState:
<sessionstate mode="SQLServer" sqlconnectionstring="..." sqlcommandtimeout="..."></sessionstate>
При этом ёмкая сессия будет размещаться в БД, а не в памяти процесса.