繁体   English   中英

如何在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,并希望向所有连接的客户端发送消息。

我已经以本教程为起点。

我有从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM