Сообщения от сервера к клиенту, не проходящие через SignalR в ASP.NET MVC 4
Я создал простое тестовое приложение, чтобы воспроизвести проблему, с которой я столкнулся в своем основном приложении.
У меня есть следующий класс концентратора:
[HubName("testHub")]
public class TestHub : Hub
{
public TestHub()
{
System.Diagnostics.Debug.WriteLine("TestHub instantiated");
}
public void RunMe()
{
System.Diagnostics.Debug.WriteLine("Client Started");
}
public static void Notify(string msg)
{
var hubContext = GlobalHost.ConnectionManager.GetHubContext<TestHub>();
hubContext.Clients.All.notify("Hello!");
}
}
Моя тестовая веб-страница:
<form action="javascript: void(0)" method="post">
<input type="button" value="Do It!" onclick="hitHub()"/>
</form>
<div id="error"></div>
<script type="text/javascript">
var tHub;
$(document).ready(function () {
tHub = $.connection.testHub;
tHub.notify = function (msg) {
alert(msg);
}
$.connection.hub.start().done(function () {
tHub.server.runMe();
});
});
function hitHub() {
$.ajax({
type: "POST",
url: "@Url.Content("~/Hub/Test")" ,
success: function (data, textStatus, jqXHR) {
},
error: function (data, textStatus, jqXHR) {
$("#error")[0].innerHTML = data.responseText;
alert("Error notifying hub.");
}
});
}
</script>
И наконец, мой HubController:
public class HubController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public void Test()
{
TestHub.Notify("Got it!");
}
}
В моем Application_Start я вызываю RouteTable.Routes.MapHubs ();
Хаб получает экземпляр. Затем вызов runMe () передается на сервер. Это все отлично работает.
Где это терпит неудачу, когда я нажимаю на «Сделай это!» кнопка. вызывается hitHub () и вызывается мой метод HubController.Test (). TestHub.Notify («Понял!») Выполняется без ошибок, однако на клиенте ничего не происходит.
Что я пропустил?
Обновление 1: Основываясь на ответе от JcFx, изменил приведенный выше javascript, чтобы tHub.notify был установлен перед вызовом $ .connection.hub.start (). Проблема остается, однако.
Обновление 2: Что видит скрипач:
Обновление 3: Когда я прослеживаю вызов MessageBus.Publish (), я замечаю, что у темы нет подписок, поэтому тема никогда не запланирована. Я не уверен, как в какой момент я должен проверять подписку ...