C# 信号器-未连接发送消息
我今天一直在试验信号器,它真的很棒。基本上,我希望实现以下目标: 设备连接后,应立即向第一台设备发送消息。如果连接的设备超过1台,我想发送两条消息。一对所有,最后连接的客户端除外。只向最后连接的客户端发送一条消息 当我将代码放在自定义API控制器中并基本上调用操作时,我使用的代码工作得非常完美,但这不是我想要的 我希望在设备在C# 信号器-未连接发送消息,c#,asp.net,signalr,signalr-hub,signalr.client,C#,Asp.net,Signalr,Signalr Hub,Signalr.client,我今天一直在试验信号器,它真的很棒。基本上,我希望实现以下目标: 设备连接后,应立即向第一台设备发送消息。如果连接的设备超过1台,我想发送两条消息。一对所有,最后连接的客户端除外。只向最后连接的客户端发送一条消息 当我将代码放在自定义API控制器中并基本上调用操作时,我使用的代码工作得非常完美,但这不是我想要的 我希望在设备在OnConnected内连接时立即发送消息,无需任何用户交互,但当我将代码放入OnConnected覆盖时,它将停止工作。它不再发送到特定的客户端(第一次连接和最后一次连接
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();
}
嗯。。。您正在返回一个任务。。。所以我认为这可能是问题所在。。。 您应该首先执行代码,然后返回任务。。。或者继续写下。。。像
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;
}
我还没有测试过。。。这只是一个猜测。因为您还没有建立连接,所以尝试调用您的客户端
。hello()
函数在OnConnected
中是不可能的。但是,我们可以定义一个服务器集线器方法,并在连接.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")
// }
}
所以这里的基本思想是首先
.done(函数(){…})代码>
server.afterConnected()
.hello()
客户机函数注意-此实现适用于JavaScript客户端-但同样的想法也可以转换为.net客户端。这主要是一个架构问题。除非我从您的问题中漏掉了什么,否则解决方案对我来说非常简单,您只需要切换到使用
Clients.Caller.hello("Send to only the last one");
不要试图了解你自己谁是最后连接的id。其他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();
}
专用异步任务ConnectToSignalR()
{
var hubConnection=新的hubConnection(“url”);
hubConnection.Headers[“x-zumo-application”]=“clientapkey”;
IHubProxy=hubConnection.CreateHubProxy(“ChatHub”);
proxy.On(“hello”,async(msg)=>
{
控制台写入线(msg);
});
等待连接。开始();
}
非常感谢您的代码。它实际上使我的代码更容易!
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();
}