如何向 NET Core 2.0 的 SignalR alpha 上的所有客户端发送消息
How to send a message to all clients on SignalR alpha for NET Core 2.0
我正在使用 signalR 1.0.0-alpha2-final 并想向所有连接的客户端发送消息。
我使用 this tutorial 作为起点。
我的 RulesHub 继承自 Hub:
[EnableCors("MyPolicy")]
public class RulesHub : Hub
{
private readonly IRuleService _ruleService;
public RulesHub(IRuleService ruleService)
{
_ruleService = ruleService;
}
public Task Send()
{
var rules = _ruleService.RulesMonitoring();
return Clients.All.InvokeAsync("SendRules", rules);
}
}
在前端我有这个代码来连接到集线器:
let connection = new signalR.HubConnection(rulesMonitorUrl);
connection.on('SendRules', function(data:any){
console.log(data);
});
连接一个客户端后,我从这个控制器调用 Send 方法:
[EnableCors("MyPolicy")]
Route("api/[controller]")]
public class MyController : Controller
{
private readonly IMyService _myService;
private RulesHub _rulesHub;
public MyController(IMyService myService, IRuleService ruleService)
{
_myService = myService;
_rulesHub = new RulesHub(ruleService);
}
[HttpPost]
public void Post([FromBody]MyClass myClass)
{
_myService.Add(myClass);
_rulesHub.Send();
}
}
但行 return Clients.All.InvokeAsync("SendRules", rules);
失败并显示以下异常消息:
System.NullReferenceException: 'Object reference not set to an
instance of an object.'
Microsoft.AspNetCore.SignalR.Hub.Clients.get returned null.
我在 ASP.NET 中读到过,您应该使用 IHubContext context = GlobalHost.ConnectionManager.GetHubContext("MyChatHub");
之类的东西,但这不适用于此版本。
有什么想法吗?
这是一个重复的问题:
切勿自行创建集线器实例。简单地将它注入你的控制器,如:
[EnableCors("MyPolicy")]
Route("api/[controller]")]
public class MyController : Controller
{
private readonly IMyService _myService;
private IHubContext<RulesHub> _rulesHubContext;
public MyController(IMyService myService, IRuleService ruleService, IHubContext<RulesHub > rulesHubContext)
{
_myService = myService;
_rulesHubContext = rulesHubContext;
}
[HttpPost]
public void Post([FromBody]MyClass myClass)
{
_myService.Add(myClass);
// Load your rules from somewhere
_rulesHubContext.Clients.All.InvokeAsync("SendRules", rules);
}
}
我正在使用 signalR 1.0.0-alpha2-final 并想向所有连接的客户端发送消息。
我使用 this tutorial 作为起点。
我的 RulesHub 继承自 Hub:
[EnableCors("MyPolicy")]
public class RulesHub : Hub
{
private readonly IRuleService _ruleService;
public RulesHub(IRuleService ruleService)
{
_ruleService = ruleService;
}
public Task Send()
{
var rules = _ruleService.RulesMonitoring();
return Clients.All.InvokeAsync("SendRules", rules);
}
}
在前端我有这个代码来连接到集线器:
let connection = new signalR.HubConnection(rulesMonitorUrl);
connection.on('SendRules', function(data:any){
console.log(data);
});
连接一个客户端后,我从这个控制器调用 Send 方法:
[EnableCors("MyPolicy")]
Route("api/[controller]")]
public class MyController : Controller
{
private readonly IMyService _myService;
private RulesHub _rulesHub;
public MyController(IMyService myService, IRuleService ruleService)
{
_myService = myService;
_rulesHub = new RulesHub(ruleService);
}
[HttpPost]
public void Post([FromBody]MyClass myClass)
{
_myService.Add(myClass);
_rulesHub.Send();
}
}
但行 return Clients.All.InvokeAsync("SendRules", rules);
失败并显示以下异常消息:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
Microsoft.AspNetCore.SignalR.Hub.Clients.get returned null.
我在 ASP.NET 中读到过,您应该使用 IHubContext context = GlobalHost.ConnectionManager.GetHubContext("MyChatHub");
之类的东西,但这不适用于此版本。
有什么想法吗?
这是一个重复的问题:
切勿自行创建集线器实例。简单地将它注入你的控制器,如:
[EnableCors("MyPolicy")]
Route("api/[controller]")]
public class MyController : Controller
{
private readonly IMyService _myService;
private IHubContext<RulesHub> _rulesHubContext;
public MyController(IMyService myService, IRuleService ruleService, IHubContext<RulesHub > rulesHubContext)
{
_myService = myService;
_rulesHubContext = rulesHubContext;
}
[HttpPost]
public void Post([FromBody]MyClass myClass)
{
_myService.Add(myClass);
// Load your rules from somewhere
_rulesHubContext.Clients.All.InvokeAsync("SendRules", rules);
}
}