首页 > 解决方案 > SignalR Hub 发送消息但没有客户端收到它

问题描述

我有一个运行 QuartzNet 调度程序的 aspnetcore Mvc 网站。调度程序有侦听器,当作业正在执行并已执行时会触发这些侦听器。侦听器使用 MediatR 发布消息,然后由名为 JobListenerEventsDispatcher 的类处理。

此类在构造函数中注入了 IServiceProvider 以获取 SignalR 集线器。

服务器端运行 aspnetcore 2.2 QuartzScheduler 和 MediatR 都是最新版本。

来自 Startup ConfigureServices 的代码将 MediatR 服务添加到 ServiceCollection:

services.AddMediatR(typeof(Startup).GetTypeInfo().Assembly);

QuartzNet JobListener 中发布 MediatR 消息的代码:

private async Task SendJobMessage(IJobExecutionContext model,CancellationToken cancellationToken)
{
    try
    {
        await _service.Publish(new JobListenerEvent { JobContext = model }, cancellationToken);
    }
    catch (Exception)
    {
         // ignored
    }
}

调度程序中的代码从 JobListener 接收消息:

public async Task Handle(JobListenerEvent notification, CancellationToken cancellationToken)
{
    var context = _services.GetRequiredService<IHubContext<SchedulerHub>>();
    await context.Clients.All.SendAsync("jobMessage", notification, cancellationToken);
}

到目前为止,它运行良好,并且 Handle 方法正在向客户端发送消息。

添加 SignalR 并订阅来自集线器的消息的 JavaScript 代码:

    // SignalR actions
    var connection = new signalR.HubConnectionBuilder()
        .withUrl('/scheduler-hub')
        .configureLogging(signalR.LogLevel.None)
        .build();

    connection.on('jobMessage', function (model) {
        logToConsole("jobMessage", model);
        loadCurrentExecutingJobs();
    });

连接已建立,但 jobMessage 处理程序未收到服务器端的任何内容。

有没有其他人设法做到这一点?

标签: quartz.netasp.net-core-signalrmediatr

解决方案


我找到了解决方法。我让我的 Joblistener 与 api 控制器交互。控制器通过构造函数注入获取 hubcontext 并发送 msg..


推荐阅读