SignalR - 发送消息 OnConnected
SignalR - Send message 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();
}
嗯...您正在 return 执行任务...所以我认为这可能是问题所在...
你应该先执行你的代码,然后 return 任务...或者放置一个 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;
}
我还没有测试过...这只是一个猜测...
由于您尚未建立连接,因此目前无法在 OnConnected
中调用您的客户端 .hello()
函数。但是,我们可以定义一个服务器集线器方法,并在我们的连接 .done
回调时立即调用它。然后,在我们新的服务器方法中,我们可以重新分配您当前在 OnConnected
中的逻辑。
这将大大改变我们的设置并引入一些额外的步骤,但请注意以下示例...
// WhateverHub
public override Task OnConnected()
{
return base.OnConnected()
}
public void AfterConnected()
{
// if(stuff) -- whatever if/else first user/last user logic
// {
Clients.Caller.hello("message")
// }
}
var proxy= $.connection.whateverHub;
proxy.client.hello = function(message) {
// last step in event chain
}
$.connection.hub.start().done(function () {
proxy.server.afterConnected() // call AfterConnected() on hub
});
所以这里的基本思路是首先
- 连接 =>
.done(function() { ... });
- 致电
server.afterConnected()
- 在该方法中执行逻辑
- 如果我们对条件感到满意,请调用我们的
.hello()
客户端函数
注意 - 此实现适用于 JavaScript 客户端 - 但同样的想法可以转化为 .net 客户端。这主要是一个架构问题。
除非我遗漏了你的问题,否则解决方案对我来说看起来很简单,你只需要切换到使用
Clients.Caller.hello("Send to only the last one");
而不是试图了解自己最后连接的 ID。其他的也一样,你可以使用:
Clients.Others.hello("Send to everyone except last");
您不需要您设置的所有逻辑,这两行可以满足您的需求,并且它们在 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();
}
我今天一直在试用 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();
}
嗯...您正在 return 执行任务...所以我认为这可能是问题所在... 你应该先执行你的代码,然后 return 任务...或者放置一个 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;
}
我还没有测试过...这只是一个猜测...
由于您尚未建立连接,因此目前无法在 OnConnected
中调用您的客户端 .hello()
函数。但是,我们可以定义一个服务器集线器方法,并在我们的连接 .done
回调时立即调用它。然后,在我们新的服务器方法中,我们可以重新分配您当前在 OnConnected
中的逻辑。
这将大大改变我们的设置并引入一些额外的步骤,但请注意以下示例...
// WhateverHub
public override Task OnConnected()
{
return base.OnConnected()
}
public void AfterConnected()
{
// if(stuff) -- whatever if/else first user/last user logic
// {
Clients.Caller.hello("message")
// }
}
var proxy= $.connection.whateverHub;
proxy.client.hello = function(message) {
// last step in event chain
}
$.connection.hub.start().done(function () {
proxy.server.afterConnected() // call AfterConnected() on hub
});
所以这里的基本思路是首先
- 连接 =>
.done(function() { ... });
- 致电
server.afterConnected()
- 在该方法中执行逻辑
- 如果我们对条件感到满意,请调用我们的
.hello()
客户端函数
注意 - 此实现适用于 JavaScript 客户端 - 但同样的想法可以转化为 .net 客户端。这主要是一个架构问题。
除非我遗漏了你的问题,否则解决方案对我来说看起来很简单,你只需要切换到使用
Clients.Caller.hello("Send to only the last one");
而不是试图了解自己最后连接的 ID。其他的也一样,你可以使用:
Clients.Others.hello("Send to everyone except last");
您不需要您设置的所有逻辑,这两行可以满足您的需求,并且它们在 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();
}