Идея рассматривать Метеор как постоянный слой может быть сумасшедшей. Но для этого есть веская причина: передача данных в реальном времени на подключенных клиентов с использованием протокола Distribute Data Protocol . Тогда почему мы не можем написать все приложение в Meteor, включая интерфейс пользователя, да, мы можем его поддержать. Но у некоторых людей есть предпочтения, или каждому может быть неудобно создавать потрясающий пользовательский интерфейс в Meteor, но хорошо в ASP.NET. Так как же мы соединяем лучшее из обоих миров? Давайте посмотрим на это.
Давайте подумаем об онлайн-табло по крикету, какие компоненты мы можем иметь
-
Фид счета, даемон, который получает оценку от REST Api или веб-службы и обновляет базу данных.
-
Веб-приложение, которое извлекает данные и представляет их пользователю.
Проблема в том, чтобы получить обновленную оценку, необходимую пользователю для обновления страницы. Что делать, если пользователь получает данные в режиме реального времени без обновления страницы. Давайте посмотрим, как добавить такие функции.
Здесь пользовательский интерфейс будет в ASP.NET, а клиентская библиотека DDP — это DDPClient.NET, и для передачи данных в реальном времени на подключенный клиент мы можем использовать SignalR . DDPClient.NET интегрирован с SignalR.
Давайте посмотрим, как DDPClient.NET можно использовать в этом сценарии для передачи данных подключенным клиентам. В одном из моих предыдущих постов я объяснил немного подробнее о DDPClient.NET. Недавно я добавил к нему среду SignalR, чтобы расширить DDPClient, доступный из любого типа приложения, будь то приложение ASP.NET или Javascript, приложение Windows Phone или Desktop, которое может выступать в качестве клиента SignalR.
В оставшейся части статьи мы увидим, как получать обновления в реальном времени с сервера Meteor с использованием DDPClient.NET.
Прямо сейчас в DDPClient.NET SignalR использует сам хостинг. Давайте посмотрим, как запустить DDPClient.NET, для теста я разместил его в консольном приложении.
class Program { static void Main(string[] args) { DDPClientHost host = new DDPClientHost("http://localhost:8081/", "localhost:3000"); host.Start(); Console.ReadLine(); } }
DDPClientHost принимает два параметра: первый, по которому URL-адрес DDPClient.NET должен прослушивать входящий запрос, второй — указать, где работает сервер Meteor. Затем просто вызовите функцию Start в экземпляре DDPClientHost. Вот и все, теперь DDPClient.NET готов принять входящий запрос.
ASP.NET Javascript клиент
Давайте посмотрим, как подписаться на опубликованный элемент Метеора от клиента javascript.
$(function () { var connection = $.hubConnection('http://localhost:8081/'); proxy = connection.createProxy('DDPStream') connection.start() .done(function () { proxy.invoke('subscribe', 'allproducts','product'); $('#messages').append('<li>invoked subscribe</li>'); }) .fail(function () { alert("Could not Connect!"); }); proxy.on('flush', function (msg) { $('#messages').append('<li>' + msg.prodName + '</li>'); }); });
Давайте сделаем краткий обзор кода. Как вы видете
- Узел соединения должен указывать на URL-адрес, по которому DDPClient.NET прослушивает.
- Прокси должен быть создан для DDPStream , это SignalR Hub и обязательно использовать то же имя.
-
Как только соединение успешно началось, мы должны вызвать
функцию Subscribe, объявленную в концентраторе DDPStream, с
опубликованным именем элемента, объявленным в Meteor. мы также должны передать имя возвращаемой коллекции, в этом случае она возвращает коллекцию Product.
Если в случае, если опубликованное имя Метеора и название коллекции совпадают, мы можем просто написать proxy.invoke ( ‘subscribe’ , ‘product’ ); Вам не нужно передавать имя коллекции ».
Посмотрите код ниже, чтобы узнать, как опубликовать элемент с Meteor Server
Meteor.publish("allproducts", function () { return Products.find(); });Products — это коллекция Meteor, которая возвращает Product
Products = new Meteor.Collection("product");
-
Также у нас должна быть функция
Flush, как показано ниже. Эта функция вызывается DDPStream для отправки данных подключенным клиентам.
proxy.on('flush', function (msg) { $('#messages').append('<li>' + msg.prodName + '</li>'); });
Клиент настольного / консольного приложения
Это похоже на код, показанный выше, но это будет в C #. Смотрите код ниже.
class Program { static void Main(string[] args) { var hubConnection = new HubConnection("http://localhost:8081/"); var ddpStream = hubConnection.CreateProxy("DDPStream"); ddpStream.On("flush", message => System.Console.WriteLine(message.prodName)); hubConnection.Start().Wait(); ddpStream.Invoke("Subscribe", "allproducts","product"); System.Console.Read(); } }
Вот и все, что мы сделали. Теперь о любой вставке или обновлении данных в коллекцию продукта будут немедленно уведомлены все подключенные клиенты. Если вы запустите приложение, вы увидите, что на странице ASP.NET будут показаны все новые продукты без обновления страницы. DDPClient.NET все еще находится в разработке.
Вы можете скачать DDPClient.NET и пример с Github .
Удачного кодирования …