【问题标题】:How to send new/updated data to all clients on SignalR for NET Core 2.2如何在 SignalR for NET Core 2.2 上向所有客户端发送新的/更新的数据
【发布时间】:2019-06-15 22:22:39
【问题描述】:

我对 asp.net-core 上的 signalr2 不太熟悉,请原谅我,我正在尝试创建一个关于如何使用 signalr2 与管理员和客户端一起实现实时 CRUD 应用程序的 POC,但是我遇到了 signalr 数据的问题推,我在这条线上一直收到NullReferenceException: Object reference not set to an instance of an object.await Clients.All.SendAsync("BroadcastData", data);

以下是我使用查找的一些在线示例设置 Hub 的方法:

public class OddPublisher : Hub
    {

        private readonly IOddServices _oddService;

        public OddPublisher(IOddServices oddService)
        {
            _oddService = oddService;
        }

        public async Task BroadcastData()
        {
            var data = _oddService.ClientQueryOdds();
            await Clients.All.SendAsync("BroadcastData", data); //breaks here
        }

    }

这是由管理员触发的,在成功提交和保存数据时,我调用BroadcastData()

    public class BaseController : Controller
    {
        public IOddServices _oddService;
        public readonly OddPublisher _publisher;
        public BaseController(IOddServices oddService, )
        {
            _oddService = oddService;
            _teamService = teamService;

            _publisher = new OddPublisher(oddService);
        }


        [HttpPost]
        public async Task<IActionResult> odd_entry(CreateOdd dto)
        {
            //somecode here...

            var results = _validator.Validate(dto);

            if(!results.IsValid)
            {
                results.AddToModelState(ModelState, null);

                return View(dto);
            }

            _oddService.CreateOddAndTeam(dto);

            await _publisher.BroadcastData(); //Breaks

            return RedirectToAction(nameof(index));
        }
    }

按照 Microsoft Asp.Net Core Signalr 文档中的建议,我的 Startup 已添加所有必需的服务。

这里是客户端和JS文件,

"use strict";

var connection = new signalR.HubConnectionBuilder().withUrl("/oddPublisher").build();

connection.on("BroadcastData", data => {

    console.table(data);
    //getAll();
})


connection.start().then(function () {
    getAll();
}).catch(function (err) {
    return console.error(err.toString());
});


function getAll() {
    var model = $('#dataModel');
    $.ajax({
        url: '/home/GetLatestOddData',
        contentType: 'application/html ; charset:utf-8',
        type: 'GET',
        dataType: 'html',
        success: function (result) { model.empty().append(result); }
    });
}

在这里需要一些帮助,我仍然不知道做错了什么,如果我能得到任何帮助,我将非常感激。

提前谢谢你。

【问题讨论】:

  • 我建议你先调试一下那行,看看哪些被调用的成员是空的
  • 另外,如果在该方法中没有等待其他任何东西,那么只需 return Clients.All.SendAsync("BroadcastData", data) 并删除 async
  • 因为我不确定这是问题所在,但我尝试过同样的问题在调试时仍然存在
  • 在单步执行代码时,你能识别出哪个变量为空吗?
  • 我的意思是,没有一个是空的,这里有数据var data = _oddService.ClientQueryOdds(); 更多的原因是为什么我有点困惑空异常的来源。

标签: c# asp.net-core-2.1 asp.net-core-signalr signalr-2


【解决方案1】:

事实证明,我需要将 IHubContext 注入到我的集线器中才能访问客户端。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    相关资源
    最近更新 更多