SignalR-Отправить сообщение OnConnected
Я сегодня экспериментировал с SignalR, и это действительно здорово. В основном я хотел достичь следующего:
как только устройство подключается, оно должно отправить сообщение первому. Если подключено больше устройств, чем 1, я хотел бы отправить два сообщения. Один ко всем за исключением последний подключенный клиент. И одно сообщение только последний подключенный клиент.
код, который я использую работает отлично, когда я в пользовательском контроллере API и в основном вызывают действие, но это не то, что я хочу.
Я хотел бы отправить сообщение, как только устройство подключается в OnConnected
без какого-либо взаимодействия с пользователем, но когда я разместить свой код внутри OnConnected
переопределить его перестает работать. Он больше не отправляет определенным клиентам (первый подключенный и последний подключенный).
Я надеюсь, что кто-то может помочь мне с этим, потому что я был биться головой в течение нескольких часов сейчас.
public override System.Threading.Tasks.Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);
int amountOfConnections = UserHandler.ConnectedIds.Count;
var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();
if (amountOfConnections == 1)
{
Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
}
else
{
Clients.Clients(allExceptLast).hello("Send to everyone except last");
Clients.Client(lastConnection.Key).hello("Send to only the last one");
}
return base.OnConnected();
}
4 ответов
Если я не пропустил что-то из вашего вопроса, решение выглядит довольно простым для меня, вам просто нужно переключиться на использование
Clients.Caller.hello("Send to only the last one");
вместо того, чтобы пытаться понять себя, Кто последний связан идентификатор. То же самое для других, вы можете использовать:
Clients.Others.hello("Send to everyone except last");
вам не нужна вся логика, которую вы настраиваете, эти 2 строки делают то, что вам нужно, и они работают внутри OnConnected
.
Спасибо за всю помощь (upvoted вы, ребята). На самом деле нашел проблему.. это было внутри моего клиента. Я впервые подписались на функцию "Привет" и после этого я начал HubConnection. Как только я изменил этот порядок все работало нормально.
он работал со следующим клиентским кодом:
private async Task ConnectToSignalR()
{
var hubConnection = new HubConnection("url");
hubConnection.Headers["x-zumo-application"] = "clientapikey";
IHubProxy proxy = hubConnection.CreateHubProxy("ChatHub");
proxy.On<string>("hello", async (msg) =>
{
Console.WriteLine(msg);
});
await hubConnection.Start();
}
поскольку вы еще не установили соединение, попробуйте позвонить своему клиенту
Примечание - эта реализация предназначена для клиента JavaScript, но та же идея может быть переведена на клиент .net. Это в основном архитектурный вопрос.
хорошо... вы возвращаете задание... поэтому я думаю, что это может быть проблемой... сначала вы должны выполнить свой код, а затем вернуть задачу... или поставить ContinueWith... как...
public override Task OnConnected()
{
Task task = new Task(() =>
{
UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);
int amountOfConnections = UserHandler.ConnectedIds.Count;
var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();
if (amountOfConnections == 1)
{
Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
}
else
{
Clients.Clients(allExceptLast).hello("Send to everyone except last");
Clients.Client(lastConnection.Key).hello("Send to only the last one");
}
});
task.ContinueWith(base.OnConnected());
return task;
}
Я не проверял это... это только догадка..