Signalr 客户端没有收到集线器消息?
Signalr client doesn't get hub messages?
我使用的是 .net core 5,设置简单:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub");
endpoints.MapControllers();
});
}
有了这个简单的 Hub :
public interface IChatClient
{
Task SendMessage( string message);
}
public class ChatHub : Hub<IChatClient>
{
public Task SendMessage(string message)
{
return Clients.All.SendMessage( message);
}
}
这是我的简单控制器:
public class WeatherForecastController : ControllerBase
{
private readonly IHubContext<ChatHub> _hubContext;
public WeatherForecastController(IHubContext<ChatHub> hubContext)
{
_hubContext = hubContext;
}
[HttpGet]
public async Task<IActionResult> Get()
{
await _hubContext.Clients.All.SendAsync("ReceiveMessage", $"Home page loaded at: {DateTime.Now}");
return Ok();
}
}
(为简单起见,无论何时调用 GET HTTP 端点,都应发送一条消息)。
C# 控制台客户端是:
async Task Main()
{
var uri = "http://localhost:5000/chatHub";
await using var connection = new HubConnectionBuilder().WithUrl(uri).Build();
await connection.StartAsync();
connection.On<string>("ReceiveMessage", (message) => Console.WriteLine(message));
}
问题:
这两个应用程序都可以正常工作,但是当我刷新页面时,我在客户端没有看到任何消息。
我可能在这里遗漏了一些东西。
很可能您的客户端(控制台)应用程序在任何消息到达之前就已经存在。你有:
await using var connection
这将处理连接和作用域的结尾,即方法的结尾。 connection.On
不是阻塞调用,它只是订阅了消息。所以最后你的连接被立即处理并且你的应用程序退出。
在末尾添加Console.ReadKey()
之类的内容,以进行测试。或者,不要在作用域的末尾处理连接。
更新:您说您正在使用 LINQPad 和 Util.keeprunning()
方法。这在这种情况下没有帮助,因为 keeprunning()
不是阻塞调用,它会阻止进程退出是的,直到您处理此方法返回的内容,但控制仍然离开您的方法,这意味着连接已处理因为 async using var connection = ...
。您需要删除它并在某些情况下显式处理连接(例如收到 2 条消息)。
我使用的是 .net core 5,设置简单:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSignalR();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
...
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub");
endpoints.MapControllers();
});
}
有了这个简单的 Hub :
public interface IChatClient
{
Task SendMessage( string message);
}
public class ChatHub : Hub<IChatClient>
{
public Task SendMessage(string message)
{
return Clients.All.SendMessage( message);
}
}
这是我的简单控制器:
public class WeatherForecastController : ControllerBase
{
private readonly IHubContext<ChatHub> _hubContext;
public WeatherForecastController(IHubContext<ChatHub> hubContext)
{
_hubContext = hubContext;
}
[HttpGet]
public async Task<IActionResult> Get()
{
await _hubContext.Clients.All.SendAsync("ReceiveMessage", $"Home page loaded at: {DateTime.Now}");
return Ok();
}
}
(为简单起见,无论何时调用 GET HTTP 端点,都应发送一条消息)。
C# 控制台客户端是:
async Task Main()
{
var uri = "http://localhost:5000/chatHub";
await using var connection = new HubConnectionBuilder().WithUrl(uri).Build();
await connection.StartAsync();
connection.On<string>("ReceiveMessage", (message) => Console.WriteLine(message));
}
问题:
这两个应用程序都可以正常工作,但是当我刷新页面时,我在客户端没有看到任何消息。 我可能在这里遗漏了一些东西。
很可能您的客户端(控制台)应用程序在任何消息到达之前就已经存在。你有:
await using var connection
这将处理连接和作用域的结尾,即方法的结尾。 connection.On
不是阻塞调用,它只是订阅了消息。所以最后你的连接被立即处理并且你的应用程序退出。
在末尾添加Console.ReadKey()
之类的内容,以进行测试。或者,不要在作用域的末尾处理连接。
更新:您说您正在使用 LINQPad 和 Util.keeprunning()
方法。这在这种情况下没有帮助,因为 keeprunning()
不是阻塞调用,它会阻止进程退出是的,直到您处理此方法返回的内容,但控制仍然离开您的方法,这意味着连接已处理因为 async using var connection = ...
。您需要删除它并在某些情况下显式处理连接(例如收到 2 条消息)。