Сохранить состояние объекта на веб-сервисе - PullRequest
1 голос
/ 14 апреля 2011

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

Я создал веб-сервис WCF многими способами. Я хотел бы сохранить некоторые данные в объекте на веб-сервисе во время вызова первого метода и повторно использовать их, когда клиент вызывает второй метод.

Например:

public class Toto : IToto
{
        private List<Hardware> hwList = new List<Hardware>();

        public void addHardware(Hardware hw) {
                hwList.Add(hw);
        }

        public void getHardwareList(out List<Hardware> list)
        {
                list = hwList;
        }
}

Я бы хотел, чтобы при вызове метода addHardware список сохранял в памяти все объекты оборудования, которые я в него поместил. Затем, когда я вызываю getHardwareList, получаю все объекты Hardward, ранее помещенные в список.

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

Я нашел много информации о PerSession в InstanceContextMode, но она не работает. Когда я заставляю ServiceContract быть SessionMode.Required, возникает много проблем с basicHttpBinding. Я пытался изменить его на wsHttpbinding, но безуспешно.

Мой последний вопрос: возможно ли сохранить экземпляр моего списка без сохранения его состояния в базе данных и без сериализации в запросе / ответе XML.

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

Кто-нибудь может мне помочь?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 14 апреля 2011

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

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

В обоих случаях возникает проблема масштабирования, если вы используете веб-сад или кластерные серверы.

Приветствия

Гилад

0 голосов
/ 14 апреля 2011

Хотите использовать список для каждого клиента или для каждой услуги?Если ответ для каждого клиента, то вам нужна некоторая привязка, которая поддерживает либо сеанс WCF (невозможно с BasicHttpBinding), либо вы должны ухудшить службу WCF для использования сеанса ASP.NET (с помощью AspNetCompatibility), либо вы должны добавить свой собственный механизм.Если ответ для каждой службы (все клиенты будут иметь доступ к одному и тому же списку), вы должны использовать InstanceContextMode.Single и обрабатывать синхронизацию в своих методах (один клиент может добавить HW в список в то же время, когда другой клиент хочет список чтения).

...