|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
Есть объект, состоящий из коллекций, отдельных полей со значениями и т. п. Клиент запрашивает состояние объекта примерно раз в секунду, но за это время не все свойства объекта могут измениться. Как сделать так, чтобы служба отсылала только изменённые свойства объекта? Скажем, в одну из коллекций добавились значения, в другой удалились, в третей смешанные опарации произошли, плюс пара свойств сменилась. На локальной машине я бы сделал эти коллекции ObservableCollection и реализовал интерфейс INotifyPropertyChanged для свойств. Тогда байндинги на клиентском интерфейсе сработали бы только на изменившихся свойствах и элементах коллекций. Есть ли что-то подобное для WCF, или только свою реализацию писать надо? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2014, 19:56 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
WCF это не умеет. Это умеет OData, там есть полноценная модель, есть ObservableCollection и INotifyPropertyChanged. То есть полная инфраструктура для подобных задач. Очень удобно. Вот тут подробно про трекинг писал http://codearticles.ru/articles/2519 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2014, 20:28 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
А это работает с универсальными приложениями для магазина? Т. е. чтобы и на виндофоне запускались, и на десктопной винде в Modern-интерфейсе. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 08:54 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
И если что-то своё подобное городить, какую бы схему вы посоветовали? Мне первое, что пришло в голову, это к каждому свойству приписать булевскую переменную, которая говорит, изменилось ли свойство. А для коллекций создавать вспомогательные коллекции, типа RemovedItems, AddedItems, ChangedItems - т. е. фактически создать свой класс, который бы содержал всю эту функциональность по хранению и отслеживанию изменений в коллекции. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 08:57 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
И ещё, тут пишут, что есть какие-то WCF Data Services, которые могут работать с OData - т. е. я всё таки могу через WCF получить желаемую мне функциональность по отслеживанию изменений и передаче только изменённых частей? Я пока с этим не разбирался - может, это не даёт такой функциональности? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 09:05 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
НемоКэп42А это работает с универсальными приложениями для магазина? Т. е. чтобы и на виндофоне запускались, и на десктопной винде в Modern-интерфейсе. Кончено. Мы это пользуем в плиточном модерн и в WPF. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 09:13 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
НемоКэп42И если что-то своё подобное городить, какую бы схему вы посоветовали? Мне первое, что пришло в голову, это к каждому свойству приписать булевскую переменную, которая говорит, изменилось ли свойство. А для коллекций создавать вспомогательные коллекции, типа RemovedItems, AddedItems, ChangedItems - т. е. фактически создать свой класс, который бы содержал всю эту функциональность по хранению и отслеживанию изменений в коллекции. Я бы рекомендовал не городить велосипед, а взять готовый функционал. Тем более он не такой тривиальный, как кажется. С OData на клиенте работаешь так же, как с EF, который трачит изменения. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 09:16 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
МСУ, понятно. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 11:55 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
А мне всё таки про WCF интересно. Если я передаю объект, у которого некоторые поля ссылочных типов равны null - они как сериализуются при передаче? Они много места занимают? А то я подумал, что мне всё же синхронизация не нужна, или далеко не везде нужна. У меня клиент передаёт серверу пакет данных, сервер их считает и выдаёт объект результатов. Синхронизация через отслеживание изменений тут лишняя, т. к. проще, наверное, просто отдавать клиенту каждый раз новый объект результатов. Тем более, что логика обработки результатов устроена в основном так, что как бы отбрасывает старые результаты и заменяет их новыми - т. е. может быть так, что отслеживание изменений будет слишком накладным. Вот я и хотел узнать, что если передача неназначенных свойств и пустых коллекций ненакладна, то мне change tracking всякие не нужны - слишком усложнены они для моей задачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 21:33 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
А синхронизацию я не хочу вот по какой причине. Я даже на локальной машине сталкивался с проблемой синхронизации при многопотоке. Не успевает UI-часть обновлять интерфейс, как расчётная уже приготовила новые данные. И часто возникает ошибка типа изменённого перечисления, когда расчёт уже поменял какую-нибудь коллекцию, а UI ещё по ней итерирует. Вот я и пришёл к выводу, что проще результаты расчёта накапливать, а UI будет отрисовывать только самый последний накопленный результат. А трекинг изменений меня беспокоил только потому, что я боялся - не сильно ли много данных будет передаваться. Если пустые коллекции сериализуются в небольшой объём данных, то всё нормально. У меня примерно раз в секунду клиент будет отдавать серверу несколько десятков килобайт данных. А сервер сразу по завершению расчёта (скорее всего, тоже раз в секунду, т. к. на таком объёме данных он точно успеет всё посчитать и сформировать объект результатов) будет отдавать результаты обратно клиенту. Так вот, на локальной машине UI не всегда успевал раз в секунду отрисовывать результаты. А клиентские устройства и того тормознее могут быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 21:45 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
НемоКэп42А мне всё таки про WCF интересно. Если я передаю объект, у которого некоторые поля ссылочных типов равны null - они как сериализуются при передаче? Они много места занимают? Не заморачивайся мелочами. Либо пустые атрибуты, либо их вообще не будет, в зависимости от wcf привязки и формата. НемоКэп42т. е. может быть так, что отслеживание изменений будет слишком накладным. Вот я и хотел узнать, что если передача неназначенных свойств и пустых коллекций ненакладна, то мне change tracking всякие не нужны - слишком усложнены они для моей задачи. Так отслеживание изменений на стороне клиента, а не на стороне сервера. Ты уж определись, нужны ли ObservableCollection и INotifyPropertyChanged у объектов. А то сначала пишешь, что нужно, потом ровно обратное. Определись с архитектурой, а технологию потом подберем. НемоКэп42А синхронизацию я не хочу вот по какой причине. Я даже на локальной машине сталкивался с проблемой синхронизации при многопотоке. Не успевает UI-часть обновлять интерфейс, как расчётная уже приготовила новые данные. И часто возникает ошибка типа изменённого перечисления, когда расчёт уже поменял какую-нибудь коллекцию, а UI ещё по ней итерирует. В этом плане нужен полностью асинхронный UI. В XAML отлично разруливается через MVVM + async/await. НемоКэп42У меня примерно раз в секунду клиент будет отдавать серверу несколько десятков килобайт данных. Ну это копейки, тут вопрос больше к каналу и его загруженности. НемоКэп42Так вот, на локальной машине UI не всегда успевал раз в секунду отрисовывать результаты. А клиентские устройства и того тормознее могут быть. А зачем результаты в UI отрисовывать каждую секунду? Они асинхронно будут отрисовываться по мере ответа сервера. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2014, 22:13 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
МСУА зачем результаты в UI отрисовывать каждую секунду? Они асинхронно будут отрисовываться по мере ответа сервера. Тут получится, скорее всего, как и на локалке - сервер отвечает быстрее, чем клиент успевает нарисовать UI. Значит, на клиенте надо организовать некий буфер. Это первое. Второе. Если UI будет сильно запаздывать - скажем, на 2-3 секунды, да ещё это запаздывание будет накапливаться, то это плохо, потому что клиент должен отрисовывать как можно более актуальные данные. Значит, клиенту из буфера надо брать только самые последние пришедшие данные. Поэтому я пока планирую просто организовать на клиенте буфер в виде обычной коллекции, сохраняющей тип объекта результата. Сервер заполняет этот буфер как успевает, а клиент считывает только самое последнее значение. Для такой простой схемы синхронизации и отслеживания изменений, думаю, излишни. МСУТы уж определись, нужны ли ObservableCollection и INotifyPropertyChanged у объектов. А то сначала пишешь, что нужно, потом ровно обратное. Определись с архитектурой, а технологию потом подберем. Ну, это поначалу я думал организовать на клиенте такую же схему, как на локальном приложении. А потом придумал то, что выше - без оверхеда синхронизации. По-моему, мой вариант проще. С накапливанием результата в буфере там самый большой оверхед за 1 минуту работы - 4-5 экземпляров объекта результата будет в коллекции. А сеанс работы клиента за раз - не более нескольких минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2014, 08:01 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
>НемоКэп42, сегодня, 08:01 [17063079] >... Поэтому я пока планирую просто организовать на клиенте буфер в виде обычной коллекции, сохраняющей тип объекта результата. В своё время для обеспечения работы диспетчерской службы и ремонтных бригад по обслуживанию тепловых пунктов применил такую схему: Имеем: а) сервер с WCF-сервисом, содержащий : 1. Некий объект (хранилище) данных 2. Динамический сериализованный снимок этого объекта в МемогуStream на определенный момент времени 3. Структуру данных типа циклический массив для записи, хранения и выдачи ссылок на сериализованные команды (byte[]) изменения данных хранилища 4. WCF-сервис работает с хранилищем и динамическим массивом 5. Периодически (например, раз в минуту) метод сервиса строит сериализацию хранилища и запоминает текущий индекс чтения в циклическом массиве. 6. Периодически (например, раз в секунду) другой метод сервиса по своему индексу чтения считывает команду изменения данных из динамического массива и обрабатывает ее (не удаляя из массива). б) некоторое множество клиентов серверного WCF-сервиса, они могут: 1. Считывать сериализованный снимок хранилища и запомненный индекс чтения динамического массива. 2. Периодически считывать команды изменения данных хранилища по своему индексу чтения из циклического массива, и изменять свою локальную копию хранилища. 3. Формировать и записывать (обращаясь к WCF-сервису) команду изменения данных. При записи ссылка на стираемую команду удаляется, соответственно и удаляется место её содержащее. С уважением, Владимир. p.s. извини, что несколько сумбурно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2014, 15:02 |
|
WCF - Как отправить клиенту только те части объекта, которые обновились?
|
|||
---|---|---|---|
#18+
НемоКэп42, возможно тебе стоить рассмотреть SignalR с push сообщениями. https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847b ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2014, 15:12 |
|
|
start [/forum/topic.php?fid=19&fpage=8&tid=1396926]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 253ms |
total: | 394ms |
0 / 0 |