0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112

Уведомления в ASP.NET MVC Core

13.02.2018, 11:37. Показов 9520. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Мне для сайта необходимо сделать уведомления о том, что та или иная запись была добавлена в БД. Но проблема в том, что я делаю сайт на Core, а необходимая для таких дел библиотека SignalR для COre не разработана до конца и поддержки push-уведомлений там нет. Скажите пожалуйста, есть ли альтернативные варианты, кроме того, что мне весь сайт с нуля придётся переделывать на MVC 5?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2018, 11:37
Ответы с готовыми решениями:

Разница между ASP.NET Core 2, ASP.NET Core MVC, ASP.NET MVC 5 и ASP.NET WEBAPI 2
Здравствуйте. Я в бекенд разработке полный ноль. В чем разница между вышеперечисленными технологиями? Есть ли в них что-то общее - могу ли...

Какая разница между ASP .Net Core и ASP .Net Core MVC?
Какая разница между ASP .Net Core и ASP .Net Core MVC? Или я может что-то не так понял? И подскажите пожалуйста еще какие-то книги для...

ASP.NET MVC или ASP.NET Core
Добрый вечер, подскажите что лучшие изучать ASP.NET MVC или ASP.NET Core ? Как я понимаю ASP.NET Core это кростплатфоменое, то есть сайт...

17
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
13.02.2018, 12:47
Цитата Сообщение от Kazin94 Посмотреть сообщение
а необходимая для таких дел библиотека SignalR для COre не разработана до конца и поддержки push-уведомлений там нет
Что ты подразумеваешь под push-уведомлениями?

Он прекрасно умеет рассылать сообщения всем клиентам:
https://metanit.com/sharp/aspnet5/30.1.php

Это всё что нужно для уведомлений.

Добавлено через 1 минуту
Вот уведомления в моём представлении:
https://metanit.com/sharp/mvc5/16.5.php
0
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
13.02.2018, 12:54  [ТС]
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Что ты подразумеваешь под push-уведомлениями?
Он прекрасно умеет рассылать сообщения всем клиентам:
https://metanit.com/sharp/aspnet5/30.1.php
Это всё что нужно для уведомлений.
Добавлено через 1 минуту
Вот уведомления в моём представлении:
https://metanit.com/sharp/mvc5/16.5.php
SignalR для Core - пока что имеет функцию локального чата, не более.

Я имею в виду простые всплывающие уведомления, типа "Вы зашли туда-то", но с использованием SignalR приходит упадок. Вот я и спрашиваю, есть ли альтернатива
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
13.02.2018, 13:03
Цитата Сообщение от Kazin94 Посмотреть сообщение
SignalR для Core - пока что имеет функцию локального чата, не более.
Я чёт не пойму!
Ты оперируешь готовыми решениями (Чат, Push-уведомления,...)?
Ты пытаешься нужный функционал из коробки получить?

SignalR позволяет передавать данные в обе стороны через постоянное соединение! Это всё что он делает! Исключительно для этого он создан!
А вот на базе этого механизма можно сделать всё что угодно! И чаты и уведомления и игры!!!
0
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
13.02.2018, 13:29  [ТС]
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Я чёт не пойму!
Ты оперируешь готовыми решениями (Чат, Push-уведомления,...)?
Ты пытаешься нужный функционал из коробки получить?
SignalR позволяет передавать данные в обе стороны через постоянное соединение! Это всё что он делает! Исключительно для этого он создан!
А вот на базе этого механизма можно сделать всё что угодно! И чаты и уведомления и игры!!!
Вот смотрите, вы мне скинули статью про создание уведомлении на MVC 5, где автор использует SignalR. Но вот когда я пытаюсь сделать что то подобное, всплывает ошибка на строчке

C#
1
2
Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            // отправляем сообщение
где мне говорят о том, что нынешний SignalR не поддерживает ConnectionManager, что делает невозможным создание Push-уведомления на странице.

Вот я и спрашиваю у вас про альтернативные варианты создания хоть каких нибудь уведомлений на странице.
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
13.02.2018, 14:31
Цитата Сообщение от Kazin94 Посмотреть сообщение
Но вот когда я пытаюсь сделать что то подобное, всплывает ошибка на строчке
Дык! Он переписан по Core! Он отличается от старой версии!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class HomeController : Controller
{
    private readonly IHubContext<LiveHub> _hubContext;
 
    public HomeController(IHubContext<LiveHub> hubContext)
    {
        _hubContext = hubContext;
    }
 
    public void SendToAll(string message)
    {
        _hubContext.Clients.All.InvokeAsync("Send", message);
    }
}
Добавлено через 1 минуту
Его контекст теперь можно получать как зависимость, используя DependencyInjection
0
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
13.02.2018, 15:11  [ТС]
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Дык! Он переписан по Core! Он отличается от старой версии!
Окей, спасибо

А у вас в чатхабе лежит что нибудь?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
13.02.2018, 15:39
Цитата Сообщение от Kazin94 Посмотреть сообщение
А у вас в чатхабе лежит что нибудь?
Нет.
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,818
13.02.2018, 22:44
Вообще с NET Core нужно аккуратнее , можно получить немало сюрпризов уже на пол пути - когда выяснится , что тот или иной , привычный в классике, функционал отсутствует или не реализован до конца. (или еще хуже с ошибками)
0
Warrior
 Аватар для _exp10der_
500 / 427 / 177
Регистрация: 23.11.2014
Сообщений: 932
13.02.2018, 22:45
Kazin94, Для push уведомлений можно использовать WebSocket

Цитата Сообщение от Kazin94 Посмотреть сообщение
та или иная запись была добавлена в БД
Тут все зависит от того что за бд например в PostgreSQL есть pg_notify https://www.postgresql.org/doc... otify.html
0
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
14.02.2018, 09:24  [ТС]
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Дык! Он переписан по Core! Он отличается от старой версии!
В общем, я попробовал сделать всё как там сказано, поставил SignalR, сделал хаб, добавил скрипт в контроллер, повесил его на момент, когда пользователь отправляет сообщение, ему должно написать, что всё прошло
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
namespace PersonalArea.WebUI.Controllers
{
    [Authorize(Roles = "patient, doctor")]
    public class PatientController : Controller
    {
        public UserManager<ApplicationUser> _userManager;
        public ApplicationDbContext _context;
 
        private readonly IHubContext<ChatHub> _hubContext;
 
        public PatientController(UserManager<ApplicationUser> userManager, ApplicationDbContext context, IHubContext<ChatHub> hubContext)
        {
            _userManager = userManager;
            _context = context;
            _hubContext = hubContext;
        }
 
 public void SendToAll(string message)
        {
            _hubContext.Clients.All.InvokeAsync("Send", message);
        }
 
 [HttpGet]
        public async Task<IActionResult> GetMessage(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return NotFound();
            }
            Patient patient = await _userManager.FindByIdAsync(id) as Patient;
            Messages messages = new Messages();
            if (patient == null)
            {
                return NotFound();
            }
 
            MessageDoctorViewModel model = new MessageDoctorViewModel
            {
                Message = messages.Message
            };
 
            model.Messages = _context.Messages.Where(x => x.IdSender == id & x.IdRecipient == _userManager.GetUserId(User)).GroupBy(z => z.Message);
            return View(model);
        }
        [HttpPost]
        public async Task<IActionResult> GetMessage(MessageDoctorViewModel model, string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                return NotFound();
            }
            Patient patient = await _userManager.FindByIdAsync(id) as Patient;
            if (patient == null)
            {
                return NotFound();
            }
 
            if (ModelState.IsValid)
            {
                Messages message = new Messages
                {
                    IdSender = _userManager.GetUserId(User),
                    IdRecipient = id,
                    Message = model.Message
                };
 
                await _context.Messages.AddAsync(message);
                try
                {
                    await _context.SaveChangesAsync();
                    SendToAll("Добавлен новый объект");
                    return RedirectToAction("Index", "Doctor");
                }
                catch (Exception)
                {
                    return null;
                }
            }
 
            
            return RedirectToAction("Index");
            //return View();
        }
Код в cshtml выглядит так:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@model PersonalArea.WebUI.ViewModels.MessageDoctorViewModel
@{
    ViewBag.Title = "Сообщения пациенту";
}
 
<div><span id="notification" style="color:red;font-size:15px;"></span></div>
 
<form asp-action="GetMessage" asp-controller="Patient">
    <div asp-validation-summary="All" class="text-danger"></div>
    <div class="form-group">
        <label asp-for="Message" class="control-label"></label><br />
        <textarea asp-for="Message" rows="5" cols="40" class="form-control" maxlength="2000" required></textarea>
    </div>
    <div class="form-group">
        <input type="submit" value="Отправить сообщение" class="btn btn-default" />
    </div>
 
    @if (Model.Messages.Count() == 0)
    {
        <div class="well well-large text-center">
            <h3>Сообщений от пациента нет</h3>
        </div>
    }
    else
    {
        <div class="page-header">
            <h1>Сообщения от пациента</h1>
        </div>
 
        @foreach (IGrouping<string, PersonalArea.DAL.Models.Messages> g in Model.Messages)
        {
            <div class="panel panel-default">
                @Html.Partial("TextMessages", g)
            </div>
        }
    }
</form>
 
@section scripts{
<script src="~/lib/signalr/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>
}
Но ничего вообще не происходит, что я делаю не так?

Добавлено через 48 минут
Забыл добавить код на Startup. Может тут что не так?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using PersonalArea.DAL.EF;
using PersonalArea.DAL.Models;
using PersonalArea.WebUI.Hubs;
 
namespace PersonalArea.WebUI
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }
 
        public IConfiguration Configuration { get; }
 
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<ApplicationDbContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
 
            services.AddIdentity<ApplicationUser, IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddDefaultTokenProviders();
 
            services.AddSignalR();
 
            services.AddMvc();
        }
 
        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
                app.UseDatabaseErrorPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }
 
            app.UseStaticFiles();
 
            app.UseSignalR(routes =>
            {
                routes.MapHub<ChatHub>("chat");
            });
 
            app.UseAuthentication();
 
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.02.2018, 11:52
C#
1
2
3
4
 app.UseSignalR(routes =>
            {
                routes.MapHub<ChatHub>("chat");
            });
тут вроде ChatHub


а тут:
JavaScript
1
var notificationhub = $.connection.notificationHub;
Добавлено через 5 минут
И если мапим с указанием урла
C#
1
routes.MapHub<ChatHub>("chat");
то подключаться нужно не так
JavaScript
1
var chathub = $.connection.chatHub;
а тоже через урл

JavaScript
1
2
3
let hubUrl = 'http://localhost:53759/chat';
        let httpConnection = new signalR.HttpConnection(hubUrl);
        let hubConnection = new signalR.HubConnection(httpConnection);
тебе этот урл можно не указывать и подключаться первым способом.
Не пиши этот chat при маппинге.

Добавлено через 55 минут
Хм... Трепанул малость!!!

Судя по коду
https://github.com/aspnet/Sign... Builder.cs

они убрали возможность мапинга без урла

Тогда тебе нужно будет его указать

замапь его так! Переименуй сам хаб!
C#
1
2
3
4
app.UseSignalR(routes =>
            {
                routes.MapHub<NotificationsHub>("notifications");
            });

Клиентский код будет примерно таким:

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$(document).ready(function () {//После загрузки всего документа
                //создаём соединение. Это просто создание! Пока ничего не подключено
                var connection = new signalR.HubConnection('/notifications'); 
 
                //Добавляем обработчики событий! 
                // они будут срабатывать при вызове на сервере
                connection.on('Send', function(message) {
                    alert(message);
                });
 
                //Вот тут мы подключаемся к серверу! 
                //После метода start обработчики регать нельзя.
                connection.start()
                    .then(function(){
                          //Этот код сработает после удачного подключения
                          //Теперь мы можем вызывать методы хаба с клиента.
                          // Вот именно так! Через invoke
                          connection.invoke('ИмяМетода');
                    }, function(error){
                         //Если подключение выдало ошибку
                          alert(error);
                    });
            });
Ещё раз!
Подписываемся на события, вызывая on
JavaScript
1
2
3
                connection.on('имяСобытия', function(message) {
                    alert(message);
                });
имя события это то что мы вызвали с сервера:
C#
1
2
3
4
public void SendToAll(string message)
        {
            _hubContext.Clients.All.InvokeAsync("Send", message);
        }
вот этот самый "Send" и будет именем события!

Добавлено через 2 минуты
http://gigi.nullneuron.net/gig... llo-world/
Вот тут очень простой пример! Прям пошаговый
0
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
14.02.2018, 12:09  [ТС]
LeniumSoft, уточню один вопрос: ставить надо Microsoft.AspNetCore.SignalR-alpfa и т.д., или Grey.Microsoft.AspNetCore.SignalR.Server ?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.02.2018, 12:28
все пакеты должны начинаться с

Microsoft.AspNetCore.
или
Microsoft.Extensions.
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.02.2018, 12:30
Там в моей ссылке на Metanit всё есть:


обязательно галочку на предварительные версии поставь
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.02.2018, 12:33
Клиентский js тяни через NPM
Там на metanit это тоже расписано
0
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
14.02.2018, 14:32  [ТС]
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Клиентский код будет примерно таким:
Это в Index.cshtml вставлять, да?
0
 Аватар для LeniumSoft
1454 / 847 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
14.02.2018, 17:42
Цитата Сообщение от Kazin94 Посмотреть сообщение
Это в Index.cshtml вставлять, да?
Ну. Можно. Я обычно файлом делаю и его подключаю.

Добавлено через 2 часа 46 минут
Kazin94, тут свежак завезли!

https://habrahabr.ru/company/jugru/blog/349096/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2018, 17:42
Помогаю со студенческими работами здесь

Работа с Excel в ASP.NET MVC Core
Подскажите как читать excel файлы в ASP.NET MVC Core. Пробовал различные библиотеки, все выдавали ошибки, последней использовал...

Ошибка List`1 IEnumerable [ASP.Net Core MVC]
Всем привет! Изучаю ASP .Net Core по книге Фримана Pro ASP.Net Core MVC и что-то не получается: При выводе данных из List&lt;&gt;...

ASP.NET Core MVC - Создание коллекций объектов
Здравствуйте всем! Я начинающий веб разработчик. Опыт минимальный, написал несколько простых магазинов. Пробую найти подходящий способ...

Как опубликовать ASP.Net Core MVC в Plesk?
Здравствуйте уважаемые программисты! Подскажите пожалуйста как опубликовать веб сайт написанный в Visual Studio ASP.Net Core в панель...

ASP.NET Core. Старт - что нужно знать, чтобы стать ASP.NET Core разработчиком?
Попалось хор краткое обзорное видео 2016 года с таким названием - Что нужно знать, чтобы стать ASP.NET MVC разработчиком? Сейчас уже 2018...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

Новые блоги и статьи
Трассировка корутин Kotlin с OpenTelemetry
mobDevWorks 14.07.2025
Асинхронное программирование меняет правила игры, особенно когда речь заходит о трассировке операций. В Kotlin с его корутинами эта проблема приобретает особый оттенок, который я хотел бы детально. . .
Облачные приложения на Rust: руководство по архитектуре микросервисов
golander 13.07.2025
Когда я впервые взялся за проектирование облачной платформы для одного из наших клиентов, выбор стоял между привычными Go и Java. Но после нескольких месяцев разработки микросервисной системы,. . .
Как Node.js выполняет асинхронные операции
Reangularity 13.07.2025
Каждый раз, когда я рассказываю про Node. js, возникает один и тот же вопрос: "Как эта штука может быть быстрой, если JavaScript — однопоточный язык?" И это действительно кажется парадоксом. Ведь в. . .
Как писать чистый, тестируемый и качественный код на Python
py-thonny 12.07.2025
Помню свой первый проект на Python. Работал тогда быстро, грязно, лишь бы работало. Код был похож на запутанный клубок - переменные по одной букве, функции на 200 строк, комментарии отсутствовали как. . .
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru