Я использую переменные Session внутри веб-службы для поддержания состояния между последовательными вызовами методов внешним приложением под названием QBWC.Я настроил это, украсив методы моего веб-сервиса этим атрибутом:
[WebMethod(EnableSession = true)]
Я использую переменную Session для хранения экземпляра пользовательского объекта с именем QueueManager.QueueManager имеет свойство ChangeQueue, которое выглядит следующим образом:
[Serializable]
public class QueueManager
{
...
public Queue<QBChange> ChangeQueue { get; set; }
...
, где QBChange - это настраиваемый бизнес-объект, принадлежащий моему веб-сервису.
Теперь каждый раз, когда я получаю вызовметод в моем веб-сервисе, я использую этот код для извлечения моего объекта QueueManager и доступа к своей очереди:
QueueManager qm = (QueueManager)Session[ticket];
, затем я удаляю объект из очереди, используя
qm.dequeue()
, а затемЯ сохраняю измененный объект диспетчера запросов (измененный, поскольку он содержит на один объект меньше в очереди) обратно в переменную Session, например, так:
Session[ticket] = qm;
готов к следующему вызову метода веб-службы с использованием того же билета.
Теперь вот что: если я закомментирую эту последнюю строку
//Session[ticket] = qm;
, то веб-служба будет вести себя точно так же, уменьшая размер очереди между вызовами методов.Теперь, почему это?
Кажется, что веб-служба обновляет класс, содержащийся в сериализованной форме, в переменной Session без запроса.Зачем это делать?Когда я десериализую свой объект Queuemanager, содержит ли переменная qm ссылку на сериализованный объект внутри переменной Session [ticket] ??Это кажется маловероятным.