Proxy do hub do cliente SignalR é indefinido

Eu estava seguindo este tutorial. No lado do cliente, em uma simples página html, eu fico indefinido para o proxy do hub cliente da SignalR; o que estou perdendo?

Esses links funcionam corretamente (o cliente é outro projeto asp.net mvc na mesma solução):

http://localhost:28538/Scripts/jquery.signalR-2.0.0.min.js http://localhost:28538/Scripts/jquery-1.8.2.min.js http://127.0.0.1:9077/signalr/hubs http://127.0.0.1:9077/signalr/js 

Minha class de Hub:

 class AlohaHub : Hub { public void Send(string name, string message) { Clients.All.addMessage(name, message); } } 

Classe de boot (que será passada para o WebApp.Start ):

 class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } 

A parte principal do aplicativo (um serviço do Windows, mas isso é irrelevante):

 class MyAppSvc : WinSvc.ISvc { IDisposable _app; string _url = "http://127.0.0.1:9077"; public void OnShutdown() { _app.Dispose(); } public void OnStart(string[] args) { _app = Microsoft.Owin.Hosting.WebApp.Start(_url); } public void OnStop() { _app.Dispose(); } } 

A página html real; o cliente:

    SigR Sample  .container { background-color: #99CCFF; border: thick solid #808080; padding: 20px; margin: 20px; }    
    $(function () { //Set the hubs URL for the connection $.connection.hub.url = "http://127.0.0.1:9077/signalr"; $.connection.hub.logging = true; // Declare a proxy to reference the hub. var chat = $.connection.alohaHub; alert(chat); // Create a function that the hub can call to broadcast messages. chat.client.addMessage = function (name, message) { // Html encode display name and message. var encodedName = $('
    ').text(name).html(); var encodedMsg = $('
    ').text(message).html(); // Add the message to the page. $('#discussion').append('
  • ' + encodedName + ':  ' + encodedMsg + '
  • '); }; // Get the user name and store it to prepend to messages. $('#displayname').val(prompt('Enter your name:', '')); // Set initial focus to message input box. $('#message').focus(); // Start the connection. $.connection.hub.start().done(function () { $('#sendmessage').click(function () { // Call the Send method on the hub. chat.server.send($('#displayname').val(), $('#message').val()); // Clear text box and reset focus for next comment. $('#message').val('').focus(); }); }); });

    Você precisa ativar o suporte a CORS no seu servidor para que o domínio cruzado funcione (também listarei como ativar o jsonp).

    Para ativar o Cors:

    1. Instalar o suporte de origem cruzada do Microsoft ASP.NET via nuget (Microsoft.Owin.Cors)
    2. Adicione isto ao seu arquivo de boot (antes da chamada do seu signalr do mapa):

    :

     app.UseCors(CorsOptions.AllowAll); // You can modify the CorsOptions 

    Para ativar o JSONP:

    Modifique o seu “MapSignalR” no seu arquivo de boot via:

     app.MapSignalR(new HubConfiguration { EnableJSONP = true }); 

    Para fazer as duas coisas juntas, você pode fazer:

     app.UseCors(CorsOptions.AllowAll) .MapSignalR(new HubConfiguration { EnableJSONP = true }); 

    Lembre-se de ativar esses resources de vários domínios no seu servidor SignalR e expô-los a possíveis vulnerabilidades de segurança.