C# 如何在SignalR alpha for NET Core 2.0上向所有客户端发送消息
我正在使用signalR 1.0.0-alpha2-final,希望向所有连接的客户端发送消息 我把它作为一个起点 我有从Hub继承的RulesHub:C# 如何在SignalR alpha for NET Core 2.0上向所有客户端发送消息,c#,signalr,signalr-hub,asp.net-core-2.0,C#,Signalr,Signalr Hub,Asp.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) { _ruleServ
[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();
}
}
但是行返回Clients.All.InvokeAsync(“SendRules”,rules)代码>失败,出现以下异常消息:
System.NullReferenceException:'对象引用未设置为
对象的实例。”
Microsoft.AspNetCore.signal.Hub.Clients.get返回空值
我已经读到,在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);
}
}
[EnableCors(“MyPolicy”)]
路由(“api/[controller]”)
公共类MyController:Controller
{
私有只读IMyService\u myService;
私有IHubContext _rulesHubContext;
公共MyController(IMyService myService、IRuleService ruleService、IHubContext rulesHubContext)
{
_myService=myService;
_rulesHubContext=rulesHubContext;
}
[HttpPost]
公共作废帖子([FromBody]MyClass MyClass)
{
_添加(myClass);
//从某处加载您的规则
_rulesHubContext.Clients.All.InvokeAsync(“SendRules”,rules);
}
}
您好,谢谢您的评论。您分享的问题似乎是针对另一个signalR版本,我不能使用Microsoft.AspNetCore.signalR.Infrastructure。我尝试了你共享的代码,但对我无效。客户没有得到规则。我不明白现在应该在RulesHub上实现什么以及您建议的更改,因为该类唯一的方法将不再使用。@jaocoleza您尝试过我的解决方案了吗。你可以让你的中心空着。连接需要轮毂。您可以将客户端可以在服务器上执行的hub方法添加到hub中我现在让hub为空,我正在调用_rulesHubContext.Clients.All.InvokeAsync(“SendRules”,rules);来自控制器,但客户端未获取信息。有没有办法检查中心的客户端?只是为了验证连接是否存在。此外,我必须更改私有规则shub_RulesHub;对于专用IHubContext _rulesHubContext;和rulesHubContext.All.InvokeAsync(“SendRules”,rules);对于_rulesHubContext.Clients.All.InvokeAsync(“SendRules”,rules)@joacoleza:您可以覆盖集线器上的OnConnectedAsync。您可以在那里添加断点。然后,您将看到客户端是否连接到hub:public override任务OnConnectedAsync(){…}