SignalR集线器正在发送消息,但没有客户端收到它

时间:2019-08-15 06:47:21

标签: quartz.net asp.net-core-signalr mediatr

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

为了获得SignalR集线器,此类在构造函数中注入了IServiceProvider。

服务器端正在运行aspnetcore 2.2 QuartzScheduler和MediatR均为最新版本。

启动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方法正在将消息发送给客户端。

JavaScript代码添加SignalR并订阅来自中心的消息:

    // 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处理程序未收到服务器端的任何内容。

其他任何人都可以做到吗?

1 个答案:

答案 0 :(得分:0)

我找到了解决方法。 我的Joblistener与api控制器进行了交互。 控制器通过构造函数注入获得hubcontext,并发送消息。.