Asp.net SignalR не работает во время развертывания в Azure - PullRequest
0 голосов
/ 01 февраля 2019

Я использую сигнал Asp.Net для отправки уведомлений конкретного пользователя.Все отлично работает в режиме отладки с использованием Visual Studio, но при развертывании в Azure происходит то же самое.

Я использую кэш Redis.

Startup.cs

using Microsoft.AspNet.SignalR;
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(NotifSystem.Web.Startup))]
namespace NotifSystem.Web
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            GlobalHost.DependencyResolver.UseStackExchangeRedis(new RedisScaleoutConfiguration("mySrver:6380,password=password,ssl=True", "YourServer"));
            app.MapSignalR();
        }
    }
}

My HubКласс:

using Microsoft.AspNet.SignalR;
using NotificationHub.Models.Hubs;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace NotificationHub.Hubs
{
    public class NotificationHub : Hub
    {
        private static readonly ConcurrentDictionary<string, UserHubModels> Users =
            new ConcurrentDictionary<string, UserHubModels>(StringComparer.InvariantCultureIgnoreCase);

        //private NotifEntities context = new NotifEntities();

    //Logged Use Call
    public void GetNotification()
    {
        try
        {
            string loggedUser = Context.User.Identity.Name;

            //Get TotalNotification
            //string totalNotif = LoadNotifData(loggedUser);

            //Send To
            UserHubModels receiver;
            if (Users.TryGetValue(loggedUser, out receiver))
            {
                var cid = receiver.ConnectionIds.FirstOrDefault();
                var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
                context.Clients.Client(cid).broadcaastNotif();
            }
        }
        catch (Exception ex)
        {
            ex.ToString();
        }
    }

    //Specific User Call
    public void SendNotification(string SentTo,string Notification)
    {
        try
        {
            //Get TotalNotification
            //string totalNotif = LoadNotifData(SentTo);

            //Send To
            UserHubModels receiver;
            if (Users.TryGetValue(SentTo, out receiver))
            {
                var cid = receiver.ConnectionIds.FirstOrDefault();
                var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
                context.Clients.Client(cid).broadcaastNotif(Notification);
            }
        }
        catch (Exception ex)
        {
            ex.ToString();
        }
    }

    private string LoadNotifData(string userId)
    {
        return userId;
        int total = 0;
        //var query = (from t in context.Notifications
        //             where t.SentTo == userId
        //             select t)
        //            .ToList();
        total = 6;
        return total.ToString();
    }

    public override Task OnConnected()
    {

        string userName = Context.User.Identity.Name;
        string connectionId = Context.ConnectionId;

        var user = Users.GetOrAdd(userName, _ => new UserHubModels
        {
            UserName = userName,
            ConnectionIds = new HashSet<string>()
        });

        lock (user.ConnectionIds)
        {
            user.ConnectionIds.Add(connectionId);
            if (user.ConnectionIds.Count == 1)
            {
                Clients.Others.userConnected(userName);
            }
        }

        return base.OnConnected();
    }

    public override Task OnDisconnected(bool stopCalled)
    {
        string userName = Context.User.Identity.Name;
        string connectionId = Context.ConnectionId;

        UserHubModels user;
        Users.TryGetValue(userName, out user);

        if (user != null)
        {
            lock (user.ConnectionIds)
            {
                user.ConnectionIds.RemoveWhere(cid => cid.Equals(connectionId));
                if (!user.ConnectionIds.Any())
                {
                    UserHubModels removedUser;
                    Users.TryRemove(userName, out removedUser);
                    Clients.Others.userDisconnected(userName);
                }
            }
        }

        return base.OnDisconnected(stopCalled);
    }
}

}

Код JavaScript:

var hub = $.connection.notificationHub;
hub.client.broadcaastNotif = function (notification) {
    setTotalNotification(notification)
};
$.connection.hub.start()
    .done(function () {
        console.log("Connected!");
        hub.server.getNotification();
    })
    .fail(function () {
        console.log("Could not Connect!");
    }); 
 });

function setTotalNotification(notification) {
    if (notification) {
        GetUnreadNotificationCount();
        $('#m_topbar_notification_icon .m-nav__link-icon').addClass('m-animate-shake');
        $('#m_topbar_notification_icon .m-nav__link-badge').addClass('m-animate-blink');
    }
    else {
        $('#m_topbar_notification_icon .m-nav__link-icon').removeClass('m-animate-shake');
        $('#m_topbar_notification_icon .m-nav__link-badge').removeClass('m-animate-blink');
    }
}

Я включил Websocket для этой конкретной службы приложений.

Отправка уведомлений между пользователямине удастся, он работает, только если вошедший в систему пользователь отправляет уведомление только себе.

Обновление:

Я проверил, что когда вошедший в систему пользователь выполняет действие, чтобы уведомление отправлялось этому конкретному пользователю, оно работало.Например, если пользователь user1 отправляет уведомление на user1, тогда проблема не возникает.

1 Ответ

0 голосов
/ 09 июля 2019

У нас была та же проблема с нашим Azure SignalR redis BackPlane POC .

Но мы попытались переадресовать без порта SSL, после чего Redis BackPlane Azure SignalR начал работать нормально.Пожалуйста, проверьте скриншот ниже.Теперь, когда окружающая среда является самодостаточной, она нам не нужна, даже HTTPS.Мы управляем этим с помощью групп ресурсов и белых списков портов.

enter image description here

...