GlobalHost.ConnectionManager.GetHubContext <myhub>()将返回没有客户端

时间:2015-09-07 07:28:23

标签: c# model-view-controller signalr

我正在尝试使用mvc应用程序中的SignalR向所有客户端广播消息。我遇到的问题是,当我使用此代码时

var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

上下文没有客户端,因此不会广播该消息。下面是我正在使用的代码的简化版本。我错过了什么?感谢

观点:

@using System.Web.UI.WebControls
@using MyApp.Models
@model MyApp.Models.MyModel

<form class="float_left" method="post" id="form" name="form">
    <fieldset>
        Username: <br/>
        @Html.TextBoxFor(m => m.Username, new { Value = Model.Username })
        <br/><br/>
        <input id="btnButton" type="button" value="Subscribe"/>
        <br/><br/>
        <div id="notificationContainer"></div>
    </fieldset>
</form>
@section scripts {
    <script src="~/Scripts/jquery.signalR-2.2.0.min.js"></script>
    <script src="~/signalr/hubs"></script>
    <script>
        $(function () {
            var notification = $.connection.notificationHub;
            notification.client.addNewMessageToPage = function (message) {
                $('#notificationContainer').append('<strong>' + message + '</strong>');
            };

            $.connection.hub.start();

        });

        $("#btnButton").click(function () {
            $.ajax({
                url: "/Home/Subscribe",
                data: $('#form').serialize(),
                type: "POST"
            });
        });

    </script>
}

The Hub:

namespace MyApp.Hubs
{
    public class NotificationHub : Hub
    {
        public void Send(string message)
        {
            Clients.All.addNewMessageToPage(message);
        }
    }
}

控制器:

namespace MyApp.Controllers
{
    public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public void Subscribe()
        {
            var message = "" // get message...

            var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
            context.Clients.All.Send(message);
        }
    }
}

1 个答案:

答案 0 :(得分:4)

你的概念有点混乱。

问题是你不能从后端的另一个地方调用一个集线器方法,所以你不能打电话给他Send hub mehod,但是从连接的客户端到任何地方(在你的情况网站)。

执行Context.Clients.doSomething()时,您实际上会调用SignalR的客户端部分并告诉它执行JavaScript方法doSomething()(如果存在)。

所以来自控制器的电话应该是context.Clients.All.addNewMessageToPage(message);

希望这会有所帮助。祝你好运!