0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 39
|
|
1 | |
Быстро растет размер wcf сервиса20.11.2015, 09:32. Показов 899. Ответов 11
Метки нет (Все метки)
Здравствуйте. Я занимаюсь изучением ASP.NET и WCF. Передо мной стоит задача - создать службу, которая будет в таймере опрашивать сеть контроллеров. Далее через приложения Windows и веб сайты считывать список показаний.
Для службы принял решение создать wcf сервис (Опыта работы с ним не было). Столкнулся с проблемой, которую вот уже 3 день не могу решить. В таймере на asp.net каждый цикл, как я понял, приложение загружается заново. В Page_Load есть метод var client = new ServiceReference1.ScadaClient(); (Инициализирует класс службы) который каждый раз инициализируется заново. И каждый раз срабатывает конструктор класса на wcf службе. И в связи с этим очень быстро растет размер памяти службы. Я делаю что-то не так, но не знаю куда копать. Как мне предотвратить постоянную инициализацию, а просто по таймеру веб приложения обращаться к методу класса службы для считывания таблицы показателей? После окончания жизненного цикла веб приложения освобождать класс ScadaClient не вариант, т.к. там свои таймеры, и задачи. Надеюсь понятно изложил суть проблемы
0
|
20.11.2015, 09:32 | |
Ответы с готовыми решениями:
11
Вызов WCF сервиса Пример WCF сервиса Запуск WCF сервиса Хостинг WCF сервиса |
20.11.2015, 09:48 | 2 |
Не совсем, но первый вопрос: вы клиента закрываете? Оберните его создание в конструкцию using(...), каждый клиент реализует IDisposable, по выходу из конструкции объект будет уничтожен.
0
|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 39
|
|
20.11.2015, 09:57 [ТС] | 3 |
Это то понятно. Ничего не помогает. Пробовал.
И почему то клиент не реализует явно Dispose(), Это нормально ? Но в using ошибку не выдает
0
|
20.11.2015, 10:02 | 4 |
Сам по себе сгенерированный Студией клиент - нет. Но он наследник от ClientBase<T>, который и реализует IDisposable.
Какой режим управления экземплярами используете? Если память растет, значит ее кто-то потребляет. Может, сделать одного клиента, как синглетную службу?
0
|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 39
|
|
20.11.2015, 10:09 [ТС] | 5 |
Память растет при повторной инициализации экземпляра. Про синглетную службу я ничего не понял. И что значит режим управления экземплярами? Я еще не ас в этом деле)
0
|
20.11.2015, 10:16 | 6 |
Служба может работать в одном из трех режимов:
1. Служба уровня вызова (при каждом вызове метода любым из клиентов создается новый экземпляр службы, после завершения метода этот экземпляр уничтожается). 2. Режим сессии (экземпляр службы создается при первом вызове любого из методов клиентом, уничтожается после явного ее закрытия или по таймауту). 3. Синглетная служба - экземпляр службы всегда один, и все клиенты просто к нему подключаются.
0
|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 39
|
|
20.11.2015, 10:41 [ТС] | 7 |
У меня сейчас служба уровня вызова. Только экземпляр, видимо, не уничтожается. А нужна синглетная.
Т.к. на ней крутятся таймеры, которые выполняют автономно определенные методы
0
|
20.11.2015, 11:17 | 8 |
Возможно, что-то мешает? Может, какие-то незакрытые ресурсы? Реализуйте в службе IDisposable и закройте их.
Либо сконфигурируйте службу так. Но масштабируемость падает.
0
|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 39
|
|
20.11.2015, 12:51 [ТС] | 9 |
А как сконфигурировать службу, что бы не инициализировать ее каждый раз, а просто подключиться? Я просто в wcf еще ничего не знаю, хотя бы литературу дайте по теме.
0
|
20.11.2015, 12:57 | 10 | |||||
К классу, реализующему контракт службы примените атрибут
Из книг могу посоветовать Джувел Леве, Создание служб WCF.
0
|
0 / 0 / 0
Регистрация: 04.10.2014
Сообщений: 39
|
|
20.11.2015, 14:10 [ТС] | 11 |
У меня почему то этот способ не срабатывает( Студия 5 минут пытается обновить ссылку на службу, а потом выдает ошибку: Неверный URI. Для остальных режимов PerCall и PerSession проходится все нормально. В чем может быть проблема ?
0
|
20.11.2015, 14:29 | 12 |
Скорее всего, служба WCF еще не запущена. Сначала ее надо запустить. Я не знаю что у вас за проект, но к примеру в форме ее можно запустить в конструкторе основной формы. В других типах примерно по аналогии, в момент создания приложения.
0
|
20.11.2015, 14:29 | |
20.11.2015, 14:29 | |
Помогаю со студенческими работами здесь
12
Конфигурация WCF сервиса Создание многопользовательского WCF-сервиса Создание асинхронного wcf-сервиса Размещение WCF сервиса на хостинге Доступность метаданных WCF сервиса Как получить ответ от WCF сервиса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |