Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как сохранять данные между вызовами в службе WCF? 
V
    Опции темы
Fighter
Дата 15.1.2014, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Служба хостится как windows-служба, binding = basicHttpBinding. 

Вот интерфейс службы:

Код

    [ServiceContract]
    public interface IService
    {

        [OperationContract]
        void Method1();

        [OperationContract]
        void Method2();
    }


Мне необходимо чтобы, например, при вызове Method1() данные сохранялись бы в какой-либо переменной, и чтобы они были доступны при вызове Method2(). 

Пример, вот:
Код

    public class MyService : IService
    {
        int a;

        void Method1() {
            a = 10;
        }

        void Method2() {
            int b = a + 10;
        }
    }



Если подключиться к такой службе, вызвать Method1() и потом Method2() то получим ошибку, потому что a = null, хотя Method1() вызывался. 

PM MAIL   Вверх
jonie
Дата 15.1.2014, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



HTTP это протокол не поддерживающий состояния. Он так и задуман. Можно, конечно, куки гонять, но вам никто за это спасибо не скажет.

Используйте персистентное хранилище (например базу).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Fighter
Дата 15.1.2014, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Хммм, а может быть тогда использовать другой биндинг?
Например, netTcp или NamedPipe?

Добавлено через 4 минуты и 50 секунд
Кстати, может все-таки дело не в http протоколе. Я через него же просто общаюсь с wcf.

Вот там есть еще такой член в классе:

Код

        private readonly ILog _logger = LogManager.GetLogger(typeof(MyService));



То есть в итоге получается так
Код

 public class MyService : IService
    {
        ...
        private readonly ILog _logger = LogManager.GetLogger(typeof(MyService));
        ...
    }


И логгер все-же между вызовами работает. А вот значение в переменной не сохраняется. 

Хотя....

Только не говорите что при каждом вызове создается весь объект заново?
PM MAIL   Вверх
jonie
Дата 16.1.2014, 09:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



Цитата(Fighter @  15.1.2014,  19:47 Найти цитируемый пост)

Только не говорите что при каждом вызове создается весь объект заново? 

...вы не поверите...


именно так, если только..
... если только вы не используете reliableSession-ы, но basicHttpBinding не поддерживает их...да и польза от них сомнительна.

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

ЗЫ: логгер надо делать static - обыкновенно все методы логгеров должны быть ThreadSafe

Это сообщение отредактировал(а) jonie - 16.1.2014, 09:02


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Fighter
Дата 20.1.2014, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Цитата(jonie @  16.1.2014,  09:01 Найти цитируемый пост)
ЗЫ: логгер надо делать static - обыкновенно все методы логгеров должны быть ThreadSafe


Да, здесь мой косяк, static забыл. А по поводу ThreadSafe, тут используется log4net и вроде как меня не должно это касаться.

Ладно, это уже оффтоп, тема другого поста.

Цитата(jonie @  16.1.2014,  09:01 Найти цитируемый пост)
именно так,


Вы ответили на мой вопрос. Спасибо. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
cully
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, cully, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Распределённые приложения и сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1349 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.