C# 如何在SignalR alpha for NET Core 2.0上向所有客户端发送消息

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

我正在使用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();
    }
}
但是行
返回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(){…}