Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/49: Рейтинг темы: голосов - 49, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112

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

13.02.2018, 11:37. Показов 9721. Ответов 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,820
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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru