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 条消息)。