Я пытаюсь внедрить службу Azure SignalR, чтобы упростить обмен сообщениями между настольным компьютером, asp.net-core и приложениями xamarin.ios.
Я создал Hub
согласно документации Microsoft здесь: https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-2.2
Концентратор:
public class ChatHub : Hub
{
public Task SendMessage(string user, string message)
{
return Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
Я добавляю подключения пользователей в группу, когдаони подключаются к концентратору, как показано здесь: https://docs.microsoft.com/en-us/aspnet/core/signalr/groups?view=aspnetcore-2.2
Добавить в группу:
public async Task AddToGroup(string groupName)
{
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}
public async Task RemoveFromGroup(string groupName)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}
Когда сообщение отправляется, в качестве параметра указывается имя группы, я хотел бы проверитьесли у указанной группы есть какие-либо подключения перед отправкой сообщения любым зарегистрированным клиентам, если нет подключений, я хотел бы отправить push-уведомление (уже есть рабочий код для push-уведомления)
Отправить сообщение с уведомлениемОткат:
public class ChatHub : Hub
{
public Task SendMessage(string groupName, string user, string message)
{
var group = Clients.Group(groupName);
// todo: how to check if we have any open connections in this group?
if(group.Conections.Count > 0)
{
return group.SendAsync("ReceiveMessage", user, message);
}
else
{
// todo: run code to send push notification or anything else you might want to do
}
}
}
Проблема: Я не вижу способа проверить количество подключений в группе в данный момент через доступные API (поправьте меня, если я 'm неправильно)
Я вижу, что группа возвращается как Microsoft.AspNetCore.SignalR.Internal.GroupProxy<ChatHub>
во время выполнения без открытых методов.Внутренние закрытые переменные включают _groupName
и _lifeTimeManager
, и в менеджере времени жизни есть _clientConnectionManager
, который, как я вижу, имеет клиентские подключения, когда они подключены, но у меня нет доступа к любому из них, я использую Microsoft.Azure.SignalR
(1.0.4) Пакет Nuget.Кто-нибудь знает, возможно ли то, что я пытаюсь сделать с помощью этого SDK, и если да, то как я могу это сделать?