【问题标题】:C# SignalR push notification real-time from Controller doesnt work来自控制器的 C# SignalR 实时推送通知不起作用
【发布时间】:2017-07-19 06:45:21
【问题描述】:

我一直在尝试在服务器上运行几个程序代码,其中包含我放在表单上并使用 MVC 控制器执行的参数。我希望控制器上已调用的每一步(方法/函数)都将信息实时更新到客户端 Web。

我一直在尝试使用 SignalR 向客户端更新实时推送通知/信息,它与客户端触发器一起使用,但是当我尝试从控制器调用集线器时它不起作用。

这是我的控制器代码:

    [HttpPost]
        public string data (Models.ExModel data)
        {
            var hub = GlobalHost.ConnectionManager.GetHubContext<Hubs.MyHub1>();
            //Execute Code 

            //send to client
            hub.Clients.All.Message(data.apaAja);

            return "success";
        }

这是我的客户端代码:

<h2>Index</h2>


@Ajax.BeginForm("data", "Home", FormMethod.Post, null) {
<div class="input-group">
    <span>Apa Aja</span>
    @Html.EditorFor(model => model.apaAja, new { htmlhtmlAttributes = new { @id = "apaAja" } })
</div>
<div class="input-group">
    <span> Boleh </span>
    @Html.EditorFor(model => model.boleh, new { htmlhtmlAttributes = new { @id = "boleh" } })
</div>
<button id="subm" type="submit">Submit</button>

<div id="container">
</div>
@section scripts{
    <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
    <script src="~/Scripts/jquery.signalR-2.2.1.min.js"></script>
    <script src="~/signalr/hubs"></script>
    <script>
        $(document).ready(function () {
            var c = $.connection.myHub1;
            c.client.messageSend = function (message) {

                var encodedMsg = $('<div />').text(message).html();
                // Add the message to the page.
                $('#container').append('<li> < strong >' + 'Info Message :  ' +
                    '</strong >:&nbsp;&nbsp; ' + encodedMsg + '</li >');
            };

        $.connection.hub.start();

        });
    </script>

这是我的 Hub 类:

namespace SignalR1.Hubs
{
    public class MyHub1 : Hub
    {
        public void Message(string message)
        {
            Clients.All.messageSend(message);
        }
    }
}

【问题讨论】:

  • 定义“不起作用”
  • @GôTô 我已经在控制器上调试,数据已捕获。但是消息没有显示在网络客户端上

标签: c# asp.net notifications signalr real-time


【解决方案1】:

您有一个名为 messageSend 的客户端回调,然后在您的集线器中正确地拥有 Clients.All.messageSend,但是当您使用 GlobalHost.ConnectionManager.GetHubContext 时,您访问的是集线器上下文而不是集线器类本身。

所以改成:

        var hub = GlobalHost.ConnectionManager.GetHubContext<Hubs.MyHub1>();
        //you don't actually have access to the MyHub1 class at this point
        // instead of
        // hub.Clients.All.Message(data.apaAja);
        // you need
        hub.Clients.All.messageSend(data.apaAja);

实际上,在使用这种机制时,hub 类的方法变得有点多余。我通常使用集线器类来管理连接和客户端,使用 onconnected 等的覆盖...

【讨论】:

  • 谢谢@reckface 我不敢相信我错过了这个。
猜你喜欢
  • 2019-09-14
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多