c# - 如何向 NET Core 2.0 的 SignalR alpha 上的所有客户端发送消息

标签 c# signalr signalr-hub asp.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);
});

连接一个客户端后,我从这个 Controller 调用 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"); 这样的东西,但这不适用于这个版本。

有什么想法吗?

最佳答案

这是一个重复的问题: Call SignalR Core Hub method from Controller

您永远不应该自己创建集线器的实例。简单地将它注入(inject)您的 Controller ,例如:

[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);
    }
}

关于c# - 如何向 NET Core 2.0 的 SignalR alpha 上的所有客户端发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47112661/

相关文章:

azure - 部署到 Azure 时未注册 SignalR 集线器

Azure 信号R : HubException method does not exist

c# - If Condition inside 开关盒

c# - 如何计算变量的值?

asp.net-mvc-4 - signalR:/signalr/hubs不会生成

javascript - 如何在应用程序的同一页面中获取所有事件用户

.net - 为 SignalR 实现背板和消息总线

signalr - 角度 : Unable to pass API url in SignalR HubConnection

c# - 如何从 C# 将对象设置为 C++

c# - 如何在Windows窗体面板中设置滚动条的位置(C#)