powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF - Как отправить клиенту только те части объекта, которые обновились?
14 сообщений из 14, страница 1 из 1
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844183
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть объект, состоящий из коллекций, отдельных полей со значениями и т. п. Клиент запрашивает состояние объекта примерно раз в секунду, но за это время не все свойства объекта могут измениться. Как сделать так, чтобы служба отсылала только изменённые свойства объекта?

Скажем, в одну из коллекций добавились значения, в другой удалились, в третей смешанные опарации произошли, плюс пара свойств сменилась. На локальной машине я бы сделал эти коллекции ObservableCollection и реализовал интерфейс INotifyPropertyChanged для свойств. Тогда байндинги на клиентском интерфейсе сработали бы только на изменившихся свойствах и элементах коллекций. Есть ли что-то подобное для WCF, или только свою реализацию писать надо?
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844205
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WCF это не умеет. Это умеет OData, там есть полноценная модель, есть ObservableCollection и INotifyPropertyChanged. То есть полная инфраструктура для подобных задач. Очень удобно. Вот тут подробно про трекинг писал http://codearticles.ru/articles/2519
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844357
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А это работает с универсальными приложениями для магазина? Т. е. чтобы и на виндофоне запускались, и на десктопной винде в Modern-интерфейсе.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844358
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И если что-то своё подобное городить, какую бы схему вы посоветовали? Мне первое, что пришло в голову, это к каждому свойству приписать булевскую переменную, которая говорит, изменилось ли свойство. А для коллекций создавать вспомогательные коллекции, типа RemovedItems, AddedItems, ChangedItems - т. е. фактически создать свой класс, который бы содержал всю эту функциональность по хранению и отслеживанию изменений в коллекции.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844361
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё, тут пишут, что есть какие-то WCF Data Services, которые могут работать с OData - т. е. я всё таки могу через WCF получить желаемую мне функциональность по отслеживанию изменений и передаче только изменённых частей? Я пока с этим не разбирался - может, это не даёт такой функциональности?
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844362
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42А это работает с универсальными приложениями для магазина? Т. е. чтобы и на виндофоне запускались, и на десктопной винде в Modern-интерфейсе.
Кончено. Мы это пользуем в плиточном модерн и в WPF.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844363
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42И если что-то своё подобное городить, какую бы схему вы посоветовали? Мне первое, что пришло в голову, это к каждому свойству приписать булевскую переменную, которая говорит, изменилось ли свойство. А для коллекций создавать вспомогательные коллекции, типа RemovedItems, AddedItems, ChangedItems - т. е. фактически создать свой класс, который бы содержал всю эту функциональность по хранению и отслеживанию изменений в коллекции.
Я бы рекомендовал не городить велосипед, а взять готовый функционал. Тем более он не такой тривиальный, как кажется. С OData на клиенте работаешь так же, как с EF, который трачит изменения.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844407
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

понятно. Спасибо.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844587
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мне всё таки про WCF интересно. Если я передаю объект, у которого некоторые поля ссылочных типов равны null - они как сериализуются при передаче? Они много места занимают?

А то я подумал, что мне всё же синхронизация не нужна, или далеко не везде нужна. У меня клиент передаёт серверу пакет данных, сервер их считает и выдаёт объект результатов. Синхронизация через отслеживание изменений тут лишняя, т. к. проще, наверное, просто отдавать клиенту каждый раз новый объект результатов. Тем более, что логика обработки результатов устроена в основном так, что как бы отбрасывает старые результаты и заменяет их новыми - т. е. может быть так, что отслеживание изменений будет слишком накладным.

Вот я и хотел узнать, что если передача неназначенных свойств и пустых коллекций ненакладна, то мне change tracking всякие не нужны - слишком усложнены они для моей задачи.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844593
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А синхронизацию я не хочу вот по какой причине. Я даже на локальной машине сталкивался с проблемой синхронизации при многопотоке. Не успевает UI-часть обновлять интерфейс, как расчётная уже приготовила новые данные. И часто возникает ошибка типа изменённого перечисления, когда расчёт уже поменял какую-нибудь коллекцию, а UI ещё по ней итерирует.

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

У меня примерно раз в секунду клиент будет отдавать серверу несколько десятков килобайт данных. А сервер сразу по завершению расчёта (скорее всего, тоже раз в секунду, т. к. на таком объёме данных он точно успеет всё посчитать и сформировать объект результатов) будет отдавать результаты обратно клиенту. Так вот, на локальной машине UI не всегда успевал раз в секунду отрисовывать результаты. А клиентские устройства и того тормознее могут быть.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844612
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42А мне всё таки про WCF интересно. Если я передаю объект, у которого некоторые поля ссылочных типов равны null - они как сериализуются при передаче? Они много места занимают?
Не заморачивайся мелочами. Либо пустые атрибуты, либо их вообще не будет, в зависимости от wcf привязки и формата.

НемоКэп42т. е. может быть так, что отслеживание изменений будет слишком накладным. Вот я и хотел узнать, что если передача неназначенных свойств и пустых коллекций ненакладна, то мне change tracking всякие не нужны - слишком усложнены они для моей задачи.
Так отслеживание изменений на стороне клиента, а не на стороне сервера. Ты уж определись, нужны ли ObservableCollection и INotifyPropertyChanged у объектов. А то сначала пишешь, что нужно, потом ровно обратное. Определись с архитектурой, а технологию потом подберем.

НемоКэп42А синхронизацию я не хочу вот по какой причине. Я даже на локальной машине сталкивался с проблемой синхронизации при многопотоке. Не успевает UI-часть обновлять интерфейс, как расчётная уже приготовила новые данные. И часто возникает ошибка типа изменённого перечисления, когда расчёт уже поменял какую-нибудь коллекцию, а UI ещё по ней итерирует.
В этом плане нужен полностью асинхронный UI. В XAML отлично разруливается через MVVM + async/await.

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

НемоКэп42Так вот, на локальной машине UI не всегда успевал раз в секунду отрисовывать результаты. А клиентские устройства и того тормознее могут быть.
А зачем результаты в UI отрисовывать каждую секунду? Они асинхронно будут отрисовываться по мере ответа сервера.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844685
НемоКэп42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУА зачем результаты в UI отрисовывать каждую секунду? Они асинхронно будут отрисовываться по мере ответа сервера.
Тут получится, скорее всего, как и на локалке - сервер отвечает быстрее, чем клиент успевает нарисовать UI. Значит, на клиенте надо организовать некий буфер. Это первое.

Второе. Если UI будет сильно запаздывать - скажем, на 2-3 секунды, да ещё это запаздывание будет накапливаться, то это плохо, потому что клиент должен отрисовывать как можно более актуальные данные. Значит, клиенту из буфера надо брать только самые последние пришедшие данные.

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

МСУТы уж определись, нужны ли ObservableCollection и INotifyPropertyChanged у объектов. А то сначала пишешь, что нужно, потом ровно обратное. Определись с архитектурой, а технологию потом подберем.
Ну, это поначалу я думал организовать на клиенте такую же схему, как на локальном приложении. А потом придумал то, что выше - без оверхеда синхронизации. По-моему, мой вариант проще. С накапливанием результата в буфере там самый большой оверхед за 1 минуту работы - 4-5 экземпляров объекта результата будет в коллекции. А сеанс работы клиента за раз - не более нескольких минут.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844791
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>НемоКэп42, сегодня, 08:01 [17063079]
>... Поэтому я пока планирую просто организовать на клиенте буфер в виде обычной коллекции, сохраняющей тип объекта результата.

В своё время для обеспечения работы диспетчерской службы и ремонтных бригад по обслуживанию тепловых пунктов применил такую схему:
Имеем:
а) сервер с WCF-сервисом, содержащий :
1. Некий объект (хранилище) данных
2. Динамический сериализованный снимок этого объекта в МемогуStream на определенный момент времени
3. Структуру данных типа циклический массив для записи, хранения и выдачи ссылок на сериализованные команды (byte[]) изменения данных хранилища
4. WCF-сервис работает с хранилищем и динамическим массивом
5. Периодически (например, раз в минуту) метод сервиса строит сериализацию хранилища и запоминает текущий индекс чтения в циклическом массиве.
6. Периодически (например, раз в секунду) другой метод сервиса по своему индексу чтения считывает команду изменения данных из динамического массива и обрабатывает ее (не удаляя из массива).

б) некоторое множество клиентов серверного WCF-сервиса, они могут:
1. Считывать сериализованный снимок хранилища и запомненный индекс чтения динамического массива.
2. Периодически считывать команды изменения данных хранилища по своему индексу чтения из циклического массива, и изменять свою локальную копию хранилища.
3. Формировать и записывать (обращаясь к WCF-сервису) команду изменения данных. При записи ссылка на стираемую команду удаляется, соответственно и удаляется место её содержащее.

С уважением,
Владимир.
p.s. извини, что несколько сумбурно.
...
Рейтинг: 0 / 0
WCF - Как отправить клиенту только те части объекта, которые обновились?
    #38844795
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НемоКэп42, возможно тебе стоить рассмотреть SignalR с push сообщениями.

https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847b
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / WCF, Web Services, Remoting [игнор отключен] [закрыт для гостей] / WCF - Как отправить клиенту только те части объекта, которые обновились?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]