Push-уведомления

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

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">.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850