请告诉我如何在非控制器类中使用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);
}
}
答案 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>();