来自 Controller 的 C# SignalR 实时推送通知不起作用

C# SignalR push notification real-time from Controller doesnt work

我一直在尝试 运行 服务器上的几个过程代码,其中包含我放在表单上并使用 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>

这是我的中心 Class :

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

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

所以改成:

        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 class 方法变得有些多余。我通常使用集线器 class 来管理连接和使用 onconnected 等覆盖的客户端...