Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Push-уведомления позволяют моментально известить пользователя о каком-то событии. И с помощью SignalR сделать подобный функционал достаточно просто.
Допустим, мы хотим, что при добавлении нового объекта в базу данных происходило уведомление всех пользователей.
Для этого создадим проект ASP.NET MVC 5 с типом аутентификации No Authentication, который пусть называется PushNotifyApp. И сразу же через менеджер NuGet добавим в проект библиотеку SignalR.
Добавим в корень проекта класс Startup
:
using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(PushNotifyApp.Startup))] namespace PushNotifyApp { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } }
Также добавим в проект папку Hubs, которая будет содержать хабы SignalR. И в ней определим класс хаба:
using Microsoft.AspNet.SignalR; namespace PushNotifyApp.Hubs { public class NotificationHub : Hub { } }
Для создания уведомлений даже не надо определять в классе никаких методов. Можно оставить его пустым.
Тогда контроллер пусть будет выглядеть следующим образом:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using PushNotifyApp.Models; using PushNotifyApp.Hubs; namespace PushNotifyApp.Controllers { public class HomeController : Controller { BookContext db = new BookContext(); public ActionResult Index() { return View(db.Books.ToList()); } public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(Book book) { db.Books.Add(book); db.SaveChanges(); SendMessage("Добавлен новый объект"); return RedirectToAction("Index"); } private void SendMessage(string message) { // Получаем контекст хаба var context = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<NotificationHub>(); // отправляем сообщение context.Clients.All.displayMessage(message); } } }
Ключевым моментом здесь является метод SendMessage()
, в котором получаем контекст хаба и отправляем сообщение всем подключенным клиентам.
И допустим, нам надо вывести это сообщение в представлении Index.cshtml:
@model IEnumerable<PushNotifyApp.Models.Book> @{ ViewBag.Title = "Index"; } <div><span id="notification" style="color:red;font-size:15px;"></span></div> <h2>Список книг</h2> <table class="table"> <tr> <th> @Html.DisplayNameFor(model => model.Name) </th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> </tr> } </table> @section scripts{ <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script> <!--Ссылка на автоматически сгенерированный скрипт хаба SignalR --> <script src="~/signalr/hubs"></script> <script type="text/javascript"> $(function () { var notificationhub = $.connection.notificationHub; notificationhub.client.displayMessage = function (message) { $('#notification').html(message); }; $.connection.hub.start(); }); </script> }
Для вывода сообщений определяется элемент <span id="notification">
.
Весь необходимый код javascript подключается в секции scripts. Предполагается, что данное представление использует мастер-страницу _Layout, и на мастер-странице перед секцией scripts подключется библиотека jquery.
И теперь после добавления нового объекта в методе Create все подключенные клиенты в представлении Index.cshtml смогут получить уведомление и увидеть его в блоке <span id="notification">
.