加入 SignalR 中的群组
Joining a group in SignalR
我正在开发 WPF 应用程序,其中程序的一个实例将能够通过 SignalR 自主机与其他程序进行通信。一切都很好,只是我不知道如何以及在哪里加入一个组,以便程序知道向哪些用户发送通知。任何帮助,将不胜感激。
这是我的示例代码:
//client side
private async void ConnectAsync()
{
Connection = new HubConnection(ServerURI);
Connection.Closed += Connection_Closed;
HubProxy = Connection.CreateHubProxy("MyHub");
//Handle incoming event from server: use Invoke to write to console from SignalR's thread
HubProxy.On<string, string>("AddMessage", (name, message) =>
this.Dispatcher.Invoke(() => RichTextBoxConsole.AppendText(String.Format("{0}: {1}\r", name, message))
)
);
try
{
await Connection.Start();
}
catch (HttpRequestException)
{
StatusText.Content = "Unable to connect to server: Start server before connecting clients.";
//No connection: Don't enable Send button or show chat UI
return;
}
HubProxy.Invoke<string>("JoinGroup", "foobar").Wait(); // Do I have to do it here?
}
//serverside
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.Group("foobar").AddMessage(name, message);
}
public Task JoinGroup(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task AddGroups()
{
return Groups.Add(Context.ConnectionId, "foobar");
}
public override Task OnConnected()
{
return AddGroups();
}
}
我觉得你说得差不多了,但是你的OnConnected
方法不太对。
尝试将其更改为:
public override Task OnConnected()
{
Groups.Add(Context.ConnectionId, "foobar");
return base.OnConnected();
}
这基本上是我使用过的代码,不同之处在于 base.OnConnected()
部分,这是我对您遇到的问题的猜测。
问题是在添加新组时:
public Task AddGroups()
{
return Groups.Add(Context.ConnectionId, "foobar");
}
出于某种原因,它在群组名称中添加了前缀 "hg-MyHub.",因此群组的名称如下所示:"hg-MyHub.foobar",当然使用此代码:
HubProxy.Invoke<string>("JoinGroup", "foobar").Wait();
没有做任何事情只是因为没有名为 "foobar" 的组。
希望这对某人有用。
我正在开发 WPF 应用程序,其中程序的一个实例将能够通过 SignalR 自主机与其他程序进行通信。一切都很好,只是我不知道如何以及在哪里加入一个组,以便程序知道向哪些用户发送通知。任何帮助,将不胜感激。 这是我的示例代码:
//client side
private async void ConnectAsync()
{
Connection = new HubConnection(ServerURI);
Connection.Closed += Connection_Closed;
HubProxy = Connection.CreateHubProxy("MyHub");
//Handle incoming event from server: use Invoke to write to console from SignalR's thread
HubProxy.On<string, string>("AddMessage", (name, message) =>
this.Dispatcher.Invoke(() => RichTextBoxConsole.AppendText(String.Format("{0}: {1}\r", name, message))
)
);
try
{
await Connection.Start();
}
catch (HttpRequestException)
{
StatusText.Content = "Unable to connect to server: Start server before connecting clients.";
//No connection: Don't enable Send button or show chat UI
return;
}
HubProxy.Invoke<string>("JoinGroup", "foobar").Wait(); // Do I have to do it here?
}
//serverside
public class MyHub : Hub
{
public void Send(string name, string message)
{
Clients.Group("foobar").AddMessage(name, message);
}
public Task JoinGroup(string groupName)
{
return Groups.Add(Context.ConnectionId, groupName);
}
public Task AddGroups()
{
return Groups.Add(Context.ConnectionId, "foobar");
}
public override Task OnConnected()
{
return AddGroups();
}
}
我觉得你说得差不多了,但是你的OnConnected
方法不太对。
尝试将其更改为:
public override Task OnConnected()
{
Groups.Add(Context.ConnectionId, "foobar");
return base.OnConnected();
}
这基本上是我使用过的代码,不同之处在于 base.OnConnected()
部分,这是我对您遇到的问题的猜测。
问题是在添加新组时:
public Task AddGroups()
{
return Groups.Add(Context.ConnectionId, "foobar");
}
出于某种原因,它在群组名称中添加了前缀 "hg-MyHub.",因此群组的名称如下所示:"hg-MyHub.foobar",当然使用此代码:
HubProxy.Invoke<string>("JoinGroup", "foobar").Wait();
没有做任何事情只是因为没有名为 "foobar" 的组。 希望这对某人有用。