Mensagens de servidor para cliente que não estão passando com o SignalR no ASP.NET MVC 4
Eu criei um aplicativo de teste simples para reproduzir um problema que estou tendo no meu aplicativo principal.
Eu tenho a seguinte classe de hub:
[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!");
}
}
Minha página de teste é:
<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>
E finalmente, meu HubController:
public class HubController : Controller
{
[AcceptVerbs(HttpVerbs.Post)]
public void Test()
{
TestHub.Notify("Got it!");
}
}
No meu Application_Start, eu chamo RouteTable.Routes.MapHubs ();
O hub é instanciado. Em seguida, a chamada para runMe () é passada para o servidor. Isso tudo funciona bem.
Onde ele falha é quando eu clico no botão "Do It!" botão. hitHub () é chamado e meu método HubController.Test () é chamado. TestHub.Notify ("Got it!") É executado sem erros, no entanto, nada acontece no cliente.
O que eu perdi?
Atualização 1: Com base na resposta do JcFx, alteramos o javascript acima para que tHub.notify seja definido antes de chamar $ .connection.hub.start (). O problema permanece, no entanto.
Atualização 2: Que violinista vê:
Atualização 3: Quando faço o rastreamento para a chamada MessageBus.Publish (), noto que o Tópico não tem assinaturas, portanto, o tópico nunca é agendado. Eu não tenho certeza de como em que ponto eu deveria estar verificando se a assinatura foi feita ...