来自Controller的SignalR广播不调用客户端方法

时间:2014-07-28 18:17:43

标签: c# asp.net-mvc-4 signalr

我正在使用Signalr 1.1而我正在尝试一个涉及更新进度条的简单项目。我已经读过其他有类似问题的人,但似乎没有真正的帮助。我以为我可能已经失去了理智。

我设置了一个中心

using Microsoft.AspNet.SignalR;

namespace VBS_MVC.Hubs
{
    public class ProgressBarHub : Hub
    {
        public void CheckSend()
        {
            Clients.All.updateProgressBar();
        }
    }
}

其中,我并非真的需要这个,但我已将其设置为进行测试。

我的控制器看起来像这样:

 [HttpPost]
        public ActionResult ProgressBarTest(string SignalRConnectionId)
        {
            // Get the value of the hidden from the request
            string currentClientConnectionId = SignalRConnectionId;

            // Get the hub context
            Microsoft.AspNet.SignalR.IHubContext myHubContext = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<Hubs.ProgressBarHub>();

            // Resolve a the client that corresponds to the current request
            dynamic currentClient = myHubContext.Clients.Client(currentClientConnectionId);

            currentClient.updateProgressBar();
            System.Threading.Thread.Sleep(2000);

            myHubContext.Clients.Client(currentClientConnectionId).updateProgressBar();
            System.Threading.Thread.Sleep(3000);

            myHubContext.Clients.All.updateProgressBar();
            System.Threading.Thread.Sleep(2000);


            return View();
        }

和我的客户:

<h2>ProgressBarTest</h2>
@using (Html.BeginForm())
{

<input type="hidden" id="mySignalRConnectionIdHidden" name="SignalRConnectionId" />
 <input type="submit" />
}

<button class="signalr">Test Send</button>

<div id="counter">
Counter
</div>

 <script src="../../Scripts/jquery.signalR-1.1.4.min.js"></script>
    <!--Reference the autogenerated SignalR hub script. -->
    <script src="/signalr/hubs"></script>
    <!--Add script to update the page and send messages.--> 
    <script type="text/javascript">

        $(function () {

            var progress = $.connection.progressBarHub;

            // Create a function that the hub can call to broadcast messages.
            progress.client.updateProgressBar = function () {
                console.log('test');
            };

            $('.signalr').click(function () {
                progress.server.checkSend();
            });

            $.connection.hub.start().done(function () {
                $("#mySignalRConnectionIdHidden").val($.connection.hub.id);
            });

            $.connection.hub.start();
        });


    </script>

connectionId看起来像是把它变成了帖子就好了,如果我点击我在表单之外的按钮(它直接与集线器对话)工作正常。正如您所看到的那样,我试图以不同的方式向客户广播,但似乎没有任何效果。我错过了什么?

2 个答案:

答案 0 :(得分:0)

尝试更改此行:

Clients.All.updateProgressBar();

要:

Clients.All.UpdateProgressBar();

我认为动态方法名称区分大小写。

答案 1 :(得分:0)

尝试将此添加到您的集线器类:

[HubName("progressBarHub")]

集线器名称区分大小写,您在javascript中使用小写的“p”调用它。