C#类中的SignalR集线器

时间:2018-08-07 05:34:01

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

请告诉我如何在非控制器类中使用SignalR。 我正在使用AspNetCore.SignalR 1.0.2。

例如我的集线器:

public class EntryPointHub : Hub
{        
    public async Task Sended(string data)
    {
       await this.Clients.All.SendAsync("Send", data);
    }  
}

在我的工作类别(hangfire)中,SignalR不起作用,我的前端未收到消息。

public class UpdateJob
{
    private readonly IHubContext<EntryPointHub> _hubContext;

    public UpdateJob(IHubContext<EntryPointHub> hubContext)
    {
        _hubContext = hubContext;
    }

    public void Run()
    {
        _hubContext.Clients.All.SendAsync("Send", "12321");
    }        
}

但是在我的控制器中效果很好。

...
public class SimpleController: Controller
{
    private readonly IHubContext<EntryPointHub> _hubContext;        

    public SimpleController(IHubContext<EntryPointHub> hubContext)
    {
        _hubContext = hubContext;
    }

    [HttpGet("sendtoall/{message}")]
    public void SendToAll(string message)
    {
        _hubContext.Clients.All.SendAsync("Send", message);
    }        
}

2 个答案:

答案 0 :(得分:1)

我认为您缺少职位类别的.net核心DI机制。在Startup.cs文件中,添加如下内容:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    services.AddScoped<UpdateJob>();
}
public void Configure(IApplicationBuilder app)
    {
        app.UseSignalR(routes =>
        {
            routes.MapHub<EntryPointHub>("ephub");
        });
    }

然后,您需要为客户端安装Signalr-client并在js文件中进行如下调用。

let connection = new signalR.HubConnection('/ephub');
connection.on('send', data => {
    var DisplayMessagesDiv = document.getElementById("DisplayMessages");
    DisplayMessagesDiv.innerHTML += "<br/>" + data;
});

希望这会对您有所帮助。

答案 1 :(得分:0)

已解决::感谢您提出意见,我实现了JobActivator并将其发送给激活器构造函数ServiceProvider(在Startup.Configure中):

IServiceProvider serviceProvider = app.ApplicationServices.GetService<IServiceProvider>();
GlobalConfiguration.Configuration
        .UseActivator(new HangfireActivator(serviceProvider));

并添加ConfigureServices:

services.AddTransient<UpdateJob>();