Mit*_*hel 9 c# asp.net signalr signalr-hub signalr.client
我今天一直在尝试使用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();
}
Run Code Online (Sandbox Code Playgroud)
Was*_*asp 11
除非我错过了你的问题,否则解决方案看起来很简单,你只需要切换到使用
Clients.Caller.hello("Send to only the last one");
Run Code Online (Sandbox Code Playgroud)
而不是试图了解自己谁是最后一个连接ID.与其他相同,您可以使用:
Clients.Others.hello("Send to everyone except last");
Run Code Online (Sandbox Code Playgroud)
你不需要你设置的所有逻辑,这2行做你需要的,他们在里面工作OnConnected.
感谢您的所有帮助(支持你们)。实际发现了问题..这是在我的客户内部。我首先订阅了“ hello”功能,然后启动了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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17578 次 |
| 最近记录: |