Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Kazin94
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
1

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

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

Добрый день. Мне для сайта необходимо сделать уведомления о том, что та или иная запись была добавлена в БД. Но проблема в том, что я делаю сайт на Core, а необходимая для таких дел библиотека SignalR для COre не разработана до конца и поддержки push-уведомлений там нет. Скажите пожалуйста, есть ли альтернативные варианты, кроме того, что мне весь сайт с нуля придётся переделывать на MVC 5?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
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...

Работа с 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 и что-то не получается:...

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

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

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

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

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

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

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

Вот я и спрашиваю у вас про альтернативные варианты создания хоть каких нибудь уведомлений на странице.
0
LeniumSoft
1440 / 830 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
Завершенные тесты: 1
13.02.2018, 14:31 6
Цитата Сообщение от 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
Kazin94
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
13.02.2018, 15:11  [ТС] 7
Цитата Сообщение от LeniumSoft Посмотреть сообщение
Дык! Он переписан по Core! Он отличается от старой версии!
Окей, спасибо

А у вас в чатхабе лежит что нибудь?
0
LeniumSoft
1440 / 830 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
Завершенные тесты: 1
13.02.2018, 15:39 8
Цитата Сообщение от Kazin94 Посмотреть сообщение
А у вас в чатхабе лежит что нибудь?
Нет.
0
sau
2087 / 1667 / 285
Регистрация: 22.07.2011
Сообщений: 6,386
Завершенные тесты: 1
13.02.2018, 22:44 9
Вообще с NET Core нужно аккуратнее , можно получить немало сюрпризов уже на пол пути - когда выяснится , что тот или иной , привычный в классике, функционал отсутствует или не реализован до конца. (или еще хуже с ошибками)
0
_exp10der_
Warrior
491 / 418 / 177
Регистрация: 23.11.2014
Сообщений: 932
13.02.2018, 22:45 10
Kazin94, Для push уведомлений можно использовать WebSocket

Цитата Сообщение от Kazin94 Посмотреть сообщение
та или иная запись была добавлена в БД
Тут все зависит от того что за бд например в PostgreSQL есть pg_notify https://www.postgresql.org/docs/current/static/sql-notify.html
0
Kazin94
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
14.02.2018, 09:24  [ТС] 11
Цитата Сообщение от 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
1440 / 830 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
Завершенные тесты: 1
14.02.2018, 11:52 12
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/SignalR/bl...outeBuilder.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/gigilabs/signalr-core-hello-world/
Вот тут очень простой пример! Прям пошаговый
0
Kazin94
0 / 0 / 0
Регистрация: 01.10.2012
Сообщений: 112
14.02.2018, 12:09  [ТС] 13
LeniumSoft, уточню один вопрос: ставить надо Microsoft.AspNetCore.SignalR-alpfa и т.д., или Grey.Microsoft.AspNetCore.SignalR.Server?
0
LeniumSoft
1440 / 830 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
Завершенные тесты: 1
14.02.2018, 12:28 14
все пакеты должны начинаться с

Microsoft.AspNetCore.
или
Microsoft.Extensions.
0
LeniumSoft
1440 / 830 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
Завершенные тесты: 1
14.02.2018, 12:30 15
Там в моей ссылке на Metanit всё есть:
Уведомления в ASP.NET MVC Core


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

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

https://habrahabr.ru/company/jugru/blog/349096/
0
14.02.2018, 17:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2018, 17:42

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru