Как заставить SignalR отправлять уведомления всем клиентам с другого хоста - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть система, которая содержит веб-приложение и приложение API.Оба приложения используют один и тот же сервисный уровень.(Это 3-х уровневая архитектура).Я организую SignalR на слое Service и регистрирую его в файле Startup.cs веб-приложения.

SignalR отлично работает в веб-приложении, когда я вызываю метод SendToHub (). Но ничего не происходит, если я вызываю SendToHub () через API.

Я ожидаю, что интерфейс WebApp должен получать уведомление при получении SignalR из приложения API.

Вызов из службы

public void SendSignal() {
     hub_communication.SendToHub(clientId:"", incommingText:"")
}

Вызов из веб-приложения и API:

Service.SendSignal();

Некоторые конфиги SignalR:

public class MainHub : Hub {
        public void Register(string group)
        {
            var clients = GlobalHost.ConnectionManager.GetHubContext<MainHub>();            
            UnRegisterAll(group, null);
            SignalRConnectionToGroupsMap.TryAddGroup(Context.ConnectionId, group);
            Clients.Caller.groupAdded(group);
        }
        public void UnRegisterAll(string userID, string organizationID)
        {
            var rets = new List<string>();
            SignalRConnectionToGroupsMap.TryRemoveAll(Context.ConnectionId, out rets);
            var clients = GlobalHost.ConnectionManager.GetHubContext<MainHub>();
            Clients.Caller.groupRemovedAll(userID);
        }
}

public static class hub_communication
    {
        public static void SendToHub(string clientid, string incoming)
        {
            var clients = GlobalHost.ConnectionManager.GetHubContext<MainHub>();
            clients.Clients.Group(clientid).receiveMessage(incoming);
        }        
    }
public static class SignalRConnectionToGroupsMap
    {
        private static readonly ConcurrentDictionary<string, List<string>> Map = new ConcurrentDictionary<string, List<string>>();

        public static bool TryAddGroup(string connectionId, string groupName)
        {
            if (!Map.TryGetValue(connectionId, out var groups))
            {
                return Map.TryAdd(connectionId, new List<string>() { groupName });
            }

            if (!groups.Contains(groupName))
            {
                groups.Add(groupName);
            }

            return true;
        }

        public static bool TryRemoveAll(string connectionId, out List<string> result)
        {
            return Map.TryRemove(connectionId, out result);
        }
    }

Startup.cs

public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ...
            app.Map("/signalr", map =>
            {                
                map.UseCors(CorsOptions.AllowAll);
                var hubConfiguration = new HubConfiguration();                
                map.RunSignalR(hubConfiguration);
            });
        }
}

1 Ответ

0 голосов
/ 24 апреля 2019

Проблема в том, что ваши приложения работают в разных доменах.В файле Startup.cs.настроить SignalR, как показано ниже:

        app.Map("/signalr", map =>
        {
            // Setup the CORS middleware to run before SignalR.
            // By default this will allow all origins. You can 
            // configure the set of origins and/or http verbs by
            // providing a cors options with a different policy.
            map.UseCors(CorsOptions.AllowAll);
            var hubConfiguration = new HubConfiguration 
            {
                // You can enable JSONP by uncommenting line below.
                // JSONP requests are insecure but some older browsers (and some
                // versions of IE) require JSONP to work cross domain
                // EnableJSONP = true
            };
            // Run the SignalR pipeline. We're not using MapSignalR
            // since this branch already runs under the "/signalr"
            // path.
            map.RunSignalR(hubConfiguration);
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...