【问题标题】:How to send a message to all clients on SignalR alpha for NET Core 2.0如何在 SignalR alpha for NET Core 2.0 上向所有客户端发送消息
【发布时间】:2017-11-06 07:06:29
【问题描述】:

我正在使用 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);
});

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

有什么想法吗?

【问题讨论】:

    标签: c# signalr signalr-hub asp.net-core-2.0


    【解决方案1】:

    这是一个重复的问题: Call SignalR Core Hub method from 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);
        }
    }
    

    【讨论】:

    • 您好,感谢您的评论。您分享的问题似乎是针对另一个 signalR 版本,我无法使用 Microsoft.AspNetCore.SignalR.Infrastructure。我尝试了您共享的代码,但它对我不起作用。客户没有得到规则。我不明白现在应该通过您建议的更改在 RulesHub 上实现什么,因为不再使用该类的唯一方法。
    • @jaocoleza 你试过我的解决方案了吗?你可以让你的集线器清空。连接需要集线器。您可以添加客户端可以在服务器上执行的集线器方法
    • 我的 Hub 现在是空的,我正在调用 _rulesHubContext.Clients.All.InvokeAsync("SendRules", rules);从控制器,但客户端没有得到信息。有没有办法检查集线器的客户端?只是为了验证连接是否存在。
    • 另外,我必须更改 private RulesHub _rulesHub;private IHubContext _rulesHubContext;rulesHubContext.All.InvokeAsync( "SendRules", rules); for _rulesHubContext.Clients.All.InvokeAsync("SendRules", rules);
    • @joacoleza:您可以覆盖集线器上的 OnConnectedAsync。在那里你可以添加一个断点。然后您将看到客户端是否连接到集线器: public override Task OnConnectedAsync() { ... }
    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 2016-09-19
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    相关资源
    最近更新 更多