Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Передать данные от сервера (asp.net) к оболочке (js/cshtml)

512  1 2 все
Ashka_hash46 патриот18.10.18 10:32
Ashka_hash46
18.10.18 10:32 

Область веб-разработки для меня новая, поэтому ищу решение...


Обычно если мне нужны какие-то данные - я с помощью ajax обращаюсь к apiController и получаю значение. Сейчас вопрос в том, что к apiController (с помощью url) обратится кто-то другой, и методом POST сообщит мне в название таблицы, в которой произошли изменения и сам вид изменений. А я должна в оболочке отразить эти изменения.


Как из обратиться к серверному методу - я знаю. Мой вопрос, как измененные методом данные донести до оболочки? (или до ViewModel.js)


Как вариант, каким-то образом сразу разбудить оболочку, а оттуда уже запросить информацию у сервера?



Общественное мнение формируют не самые умные, а самые болтливые
#1 
Ashka_hash46 патриот18.10.18 11:32
Ashka_hash46
NEW 18.10.18 11:32 
в ответ Ashka_hash46 18.10.18 10:32

Я дополню: сама задача - актуализировать данные на страничке, когда происходят изменения в базе данных. Доступа к базе у меня нет. Ей занимается другой отдел, который и предложил вмонтировать триггеры. Они, в свою очередь, будут вызывать мой урл, таким образом моя программа будет получать информацию, что что-то изменилось.


До этого (мой предшественник) обновлял страничку раз в... секунд, отчего получил мигание эрана клиента и раздражение, что "только выделишь строку, а страничка оп, и обновилась, опять выделять".

Общественное мнение формируют не самые умные, а самые болтливые
#2 
MrSanders старожил18.10.18 12:12
NEW 18.10.18 12:12 
в ответ Ashka_hash46 18.10.18 11:32

Вот неплохой ответ на принципиальный вопрос "как обновить данные в браузере с сервера": https://stackoverflow.com/questions/8110550/is-there-a-rea...

Самое простое - продолжайте обновлять. Только не раз в несколько секунд а раз в пару минут. И не всю страничку а один <div>. ajax-ом получайте новые данные и актуализируйте один блок. Если очень надо (для нетерпеливых) добавьте в этот блок коночку "обновить". Если не хотят ждать - пусть жмут.

А так - хотите WebSockets используйте, хотите пытайтесь HTTP 2.0 заставить работать.

#3 
Ashka_hash46 патриот18.10.18 12:28
Ashka_hash46
NEW 18.10.18 12:28 
в ответ MrSanders 18.10.18 12:12

Это и было мое предложение (WebSocket), но "старшим коллегой" оно отмелось.

Общественное мнение формируют не самые умные, а самые болтливые
#4 
Ashka_hash46 патриот18.10.18 12:46
Ashka_hash46
NEW 18.10.18 12:46 
в ответ Ashka_hash46 18.10.18 12:28

"Только не раз в несколько секунд а раз в пару минут."

Клиент застрелится. Грубая схема происходящего.


Когда клиент заказал пиво - на экране заявка выделена красным цветом. Когда касса одобрила заказ (он попал в базу данных) - она стала черной. Вот это "стала черной" и есть проблема на сегодня.

Общественное мнение формируют не самые умные, а самые болтливые
#5 
MrSanders старожил18.10.18 14:25
NEW 18.10.18 14:25 
в ответ Ashka_hash46 18.10.18 12:46
Клиент застрелится. Грубая схема происходящего.

Ерунда. 15 минут пока пиво ему принесут он ждать может, а 2 минуты пока у него кнопочка не почернеет - нет. А платит он как? Кредиткой оплата тоже не мгновенно присходит.

Сколько одновременно клиентов этим пользоваться будет? 10 - 100 - 1000 - 10.000?

#6 
Ashka_hash46 патриот18.10.18 15:00
Ashka_hash46
NEW 18.10.18 15:00 
в ответ MrSanders 18.10.18 14:25

Я ж говорю, очень грубая схема.


Я немного уточню: за один столик можно заказать только один вид пива, а собраться у столика могут и пять, и сто человек. И "заказывающих" аппаратов может быть много, поэтому важно "моментальное" оповещение сайта, если пиво наконец-то доставили, чтоб можно было (разлить его по стаканам) заказать повторно.


Оплаты как таковой нет, просто есть человек, который контролирует заказ. Поэтому я его нарисовала "кассой".


С пивом чисто пример... Сейчас да, жмем на "рефреш", чтобы убедиться, что можем снова заказывать.

Общественное мнение формируют не самые умные, а самые болтливые
#7 
MrSanders старожил18.10.18 15:53
NEW 18.10.18 15:53 
в ответ Ashka_hash46 18.10.18 15:00
И "заказывающих" аппаратов может быть много

Много это сколько? Если не ожидается больше 1000 (ну, до 10.000) единовременно активных клиентов, можно продолжать поллить сервер. Раз в 10 секунд, например. Или вообще - держать долгое соединение, пока сервер не ответит.

Но если и клиентов > 10.000 и скорость отклика важна, то никуда от websockets не денетесь.


Оплаты как таковой нет, просто есть человек, который контролирует заказ. Поэтому я его нарисовала "кассой".

Если в деле человек то экономить секунды на скорости обновления - бессмысленно. Опрашивайте раз в 10 секунд.

#8 
  beatus Teddybär18.10.18 16:15
beatus
NEW 18.10.18 16:15 
в ответ Ashka_hash46 18.10.18 12:46
ihr Bier kommt gleich
Чьё пиво? 😀
он попал в базу данных
На странице можно запрограммировать JavaScript - Promise для XMLHttpRequest (предпочтительный вариант, на мой взгляд, см. link). Т.е. запрос отправляется сразу и соединение остаётся открытым столько, сколько нужно. Я бы ограничил время ожидания максимум 30-60 сек. и отправлял бы новый запрос по истечении этого времени, как предложил мистер выше.
#9 
Ashka_hash46 патриот18.10.18 19:58
Ashka_hash46
NEW 18.10.18 19:58 
в ответ beatus 18.10.18 16:15

Нету, нету у меня хттпреквестов. У меня вообще нет контакта с бд, я пишу данные в SharedTypes и вызываю соответствующий метод ("заказать пиво"). Что происходит дальше - для всех закрытая информация. Ибо работой с бд занимается другой отдел фирмы, триста км от нас, связь через емайл.


Схема такая:

Оболочка (cshtml)

ViewModel (js, через ajax вызывает apicontroller)

ApiController вызывает серверную функцию

Серверная функция вызывает эти хитрые методы и возвращает результат

Общественное мнение формируют не самые умные, а самые болтливые
#10 
VseNikiZanyati посетитель18.10.18 22:13
NEW 18.10.18 22:13 
в ответ Ashka_hash46 18.10.18 19:58, Последний раз изменено 18.10.18 22:20 (VseNikiZanyati)

Учитывая, что нет доступа к БД, тут все немного сложнее: сначала нужно сообщить твоему webapi о том, что произошли изменения в БД, а потом сообщить клиенту об изменениях.

Наверное, самый простой способ сообщить webApi, о том, что произошли изменения в БД, если это ms sql, это написать триггер с EXTERNAL NAME.., который является CLR-триггером и который будет делать вызов твоего WebApi по http. Но это дурно пахнет, такие вещи делаются при помощи очередей (service bus) и обработчиков очередей - этим занимаются architect-ы и опытные dev-ы.

Для того чтобы сообщить клиенту о пришедших изменениях из пред-го шага все-равно придется "держать" соединение между клиентом и сервером(webapi), а это или websocket-ы или нечто другое, посмотри на SignalR.


А чем, кстати, старшему коллеге web-socket-ы не понравились? Если ему они не нравятся, то предложи ему предложить альтернативное решение.

#11 
AlexNek патриот18.10.18 23:11
AlexNek
NEW 18.10.18 23:11 
в ответ Ashka_hash46 18.10.18 19:58

Что то мне кажется что ты пытаешся найти кконкретное решение конкретной проблемы не имея концепта обновления данных.

Попробуй начать именно с этого - с концепта.


Есть база, есть клиенты - как клиенту узнать об обновлениях в базе? Клиент может спрашивать базу, база может оповещать клиента. Клиент - не обязательно твоя страница. Это может быть и твой сервер. Может быть и двухступенчатая схема с различными подходами.

Когда то в одном из проектов была схема подписки и сообщений. Клиент подписывался на определённые изменения, а сервер его о них уже оповещал.

#12 
  beatus Teddybär18.10.18 23:40
beatus
NEW 18.10.18 23:40 
в ответ Ashka_hash46 18.10.18 19:58, Последний раз изменено 18.10.18 23:43 (beatus)
Нету, нету у меня хттпреквестов
Да ну? А что это за POST Request в коде на картинке? 😁
ViewModel (js, через ajax вызывает apicontroller)
Не подскажете, что такое ajax? 😁
#13 
  beatus Teddybär18.10.18 23:49
beatus
NEW 18.10.18 23:49 
в ответ AlexNek 18.10.18 23:11
Когда то в одном из проектов была схема подписки и сообщений. Клиент подписывался на определённые изменения, а сервер его о них уже оповещал.
Это мало чем поможет сгенерированному сервером view (cshtml). "Проблема" в обновлении view, вызов метода класса, обращающегося к бд идёт через контроллер (или сам контроллер обращается к бд, но это уже не MVC). Вот этот метод DataTriggerController должен запрашивать JavaScript по AJAX.
#14 
AlexNek патриот19.10.18 00:15
AlexNek
NEW 19.10.18 00:15 
в ответ beatus 18.10.18 23:49
вызов метода класса, обращающегося к бд идёт через контроллер

опять конкретика. Нет сейчас ни классов ни БД спок

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

#15 
Ashka_hash46 патриот19.10.18 08:01
Ashka_hash46
NEW 19.10.18 08:01 
в ответ beatus 18.10.18 23:40, Последний раз изменено 19.10.18 08:26 (Ashka_hash46)
" А что это за POST Request в коде на картинке? 😁""Не подскажете, что такое ajax? 😁"

не скажуууууу! :D :D :D

Я просто действительно помню "сишарповское" OpenConnection и здесь для меня не очевидно, где она открылась, где закрылась.

Общественное мнение формируют не самые умные, а самые болтливые
#16 
Ashka_hash46 патриот19.10.18 08:17
Ashka_hash46
NEW 19.10.18 08:17 
в ответ AlexNek 18.10.18 23:11

"Что то мне кажется что ты пытаешся найти кконкретное решение конкретной проблемы не имея концепта обновления данных."


Оно! Прямое попадание.


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


Я даже отловила ее уже (мое первое сообщение - картнка), на сервер передать могу, а вернуть с сервера - мозгов не хватает. Ведь до этого я все данные получала по запросу из оболочки...


Но в мне действительно надо подумать в целом, как я хочу обновлять информацию. Ибо у нас много разного накручено, в том числе и переписка - надо вовремя уведомлять, когда приходит ответ.

Общественное мнение формируют не самые умные, а самые болтливые
#17 
Ashka_hash46 патриот19.10.18 08:25
Ashka_hash46
NEW 19.10.18 08:25 
в ответ VseNikiZanyati 18.10.18 22:13

"сначала нужно сообщить твоему webapi о том, что произошли изменения в БД, а потом сообщить клиенту об изменениях."


Да!!!! Именно так я и нарисовала сверху.


"сообщить webApi, о том, что произошли изменения в БД, если это ms sql, это написать триггер с EXTERNAL NAME.., который является CLR-триггером и который будет делать вызов твоего WebApi по http. Но это дурно пахнет, такие вещи делаются при помощи очередей (service bus) и обработчиков очередей - этим занимаются architect-ы и опытные dev-ы."


Это как раз не мои проблемы, ибо БД я не касаюсь. А отдел, который ими занимается, к счастью, имеет спецов нужного уровня :)


"А чем, кстати, старшему коллеге web-socket-ы не понравились? Если ему они не нравятся, то предложи ему предложить альтернативное решение."


Его альтернативное решение выглядит так:


[WebInvoke(Method = "POST", UriTemplate = "datachangedtrigger/{tablename}/{primaryKey}?apiKey={apiKey}&changeType={changeType}", BodyStyle = WebMessageBodyStyle.Bare)]

[OperationContract]

void DataChangedTrigger(string apiKey,string tablename, long primaryKey, int changeType);


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

Общественное мнение формируют не самые умные, а самые болтливые
#18 
Ashka_hash46 патриот19.10.18 08:34
Ashka_hash46
NEW 19.10.18 08:34 
в ответ MrSanders 18.10.18 15:53
Но если и клиентов > 10.000

К счастью, нет. По моим рассчетам максимальное число одновременных пользователей врядли когда дойдет до тысячи. Реальных пользователей первое время будет человек 80, не больше.


Если в деле человек то экономить секунды на скорости обновления - бессмысленно. Опрашивайте раз в 10 секунд.

Ну вот мы и вернулись к высказыванию АлексНека, что сперва надо решить, чего я хочу, а уж потом думать над реализацией :)

Общественное мнение формируют не самые умные, а самые болтливые
#19 
VseNikiZanyati посетитель19.10.18 16:10
NEW 19.10.18 16:10 
в ответ Ashka_hash46 19.10.18 08:25

Не знаю, что такое WebInvoke, но это и не важно, важна суть. Смотри, с БД приходит сообщение данные изменены на твой WebApi(напр. POST), теперь твой front-end(клиент) как-то должен об этом узнать. Http-сервер может отправить данные клиенту, только если существует tcp-ip соединение между ними, а это опять же или WebSocket-ы или что-то другое, что держит persistent connection между клиентом и сервером. Или клиент с какой-то периодичность опрашивает сервер, но тогда тебе промежуточно нужно как-то хранить инфо о БД-измененеиях.

У вас серверный ms-стек - asp.net, посмотри на библиотеку SignalR и ее push-уведомления. SignalR абстрагирует тебя от транспорта (WebSocket-ов и пр.) и позволяет сконцентрироваться на бизнес-логике: тебе придет уведомление с БД и ты сразу отправишь его клиенту - сделаешь push.

#20 
1 2 все