调用 SignalR Hub 不适用于 Asp.Net Core Web API
我是 SignalR 的新手.我正在尝试设置一个 Asp.Net Core WebAPI,以便其他客户端可以使用 SignalR 连接到它并获取实时数据.我的 Hub 类是:
I'm a newb to SignalR. I'm trying to set up a Asp.Net Core WebAPI so that other clients can connect to it using SignalR and get real-time data. My Hub class is:
public class TimeHub : Hub
{
public async Task UpdateTime(string message)
{
await Clients.All.SendAsync("ReceiveMessage", message);
}
}
我有一个中继类如下:
public class TimeRelay : ITimeRelay
{
private readonly IHubContext<TimeHub> _timeHubContext;
public TimeRelay(IHubContext<TimeHub> context)
{
_timeHubContext = context;
Task.Factory.StartNew(async () =>
{
while (true)
{
await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());
Thread.Sleep(2000);
}
});
}
}
启动类:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseHttpsRedirection();
app.UseSignalR((x) =>
{
x.MapHub<TimeHub>("/timeHub");
});
app.UseMvc();
}
客户端是一个控制台应用程序,代码是:
The client is a console application and the code is:
class Program
{
static Action<string> OnReceivedAction = OnReceived;
static void Main(string[] args)
{
Connect();
Console.ReadLine();
}
private static async void Connect()
{
var hubConnectionBuilder = new HubConnectionBuilder();
var hubConnection = hubConnectionBuilder.WithUrl("http://localhost:60211/timeHub").Build();
await hubConnection.StartAsync();
var on = hubConnection.On("ReceiveMessage", OnReceivedAction);
Console.ReadLine();
on.Dispose();
await hubConnection.StopAsync();
}
static void OnReceived(string message)
{
System.Console.WriteLine($"{message}");
}
}
我尝试调试应用程序.客户端成功连接到 TimeHub
.当客户端连接时,Clients.All
中的连接数从 0 变为 1.但是,当 await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());
被执行时,TimeHub 中的
没有被执行,客户端也没有收到任何消息.UpdateTime
函数
I tried debugging the application. The client got connected to the TimeHub
succesfully. The no of connections in Clients.All
changed from 0 to 1, when the client got connected. But, when await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());
is executed, the UpdateTime
function in TimeHub
is not getting executed and the client is not getting any message.
我尝试使用 "UpdateTime"
、"SendMessage"
和 "ReceiveMessage"
作为 Clients.All.SendAsync 中的方法
在 TimeRelay
类中.没有任何效果.有人能指出我在这方面的错误吗.
I tried using "UpdateTime"
, "SendMessage"
, and "ReceiveMessage"
as method in Clients.All.SendAsync
in TimeRelay
class. Nothing worked. Could someone point out my mistake in this.
我开始使用它,我想我会在这里回答它.感谢@TaoZhou 的提示.
I got it to work and thought I will answer it here. Thanks @TaoZhou for the tip.
我的错误是从服务器发送UpdateTime"并在客户端等待ReceiveMessage".
My mistake was sending "UpdateTime" from server and waiting on "ReceiveMessage" at the client.
理想情况下,代码应如下所示:
Ideally the code should look like the following:
SignalR 服务器:await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());
SignalR Server:await context.Clients.All.SendAsync("UpdateTime", DateTime.Now.ToShortDateString());
SignalR 客户端:var on = hubConnection.On("UpdateTime", OnReceivedAction);
SignalR Client:var on = hubConnection.On("UpdateTime", OnReceivedAction);
在这种情况下,从服务器发送的任何消息都会立即在客户端收到.
请参阅问题中提供的代码以获取更多信息.
In this case any message send from the server would be received at the client instantly.
Please refer the code provided in the question for more info.