[英]How to send a message to all clients on SignalR alpha for NET Core 2.0
我正在使用signalR 1.0.0-alpha2-final,並希望向所有連接的客戶端發送消息。
我已經以本教程為起點。
我有從Hub繼承的RulesHub:
[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:'對象引用未設置為對象的實例。
Microsoft.AspNetCore.SignalR.Hub.Clients.get返回null。
我已經讀過,在ASP.NET中,您應該使用IHubContext context = GlobalHost.ConnectionManager.GetHubContext("MyChatHub");
但這不適用於該版本。
有任何想法嗎?
這是一個重復的問題: 從Controller調用SignalR Core Hub方法
您永遠不要自己創建一個中心實例。 簡單地將其注入到控制器中,如下所示:
[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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.