У меня есть система, которая содержит веб-приложение и приложение 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);
});
}
}