2012-11-16 12 views
9

Sto provando a mettere insieme una semplice applicazione in stile "Hello World" con SignalR. Il fattore leggermente complicante è che gli hub SignalR devono essere auto-ospitati, non in IIS/ASP.NET. Ho il lato server funzionante, per quanto posso dire, ed è disponibile sulla porta 8080, ma ho problemi a collegare il client. Il problema che sto incontrando al momento è che il client SignalR sembra ignorare la porta sull'URL che ho specificato.Il client js di SignalR sembra ignorare la porta dell'URL

In particolare, ho questo codice qui:

<head runat="server"> 
    <script type="text/javascript" src="/Scripts/jquery-1.8.2.min.js"></script> 
    <script type="text/javascript" src="/Scripts/json2.min.js"></script> 
    <script type="text/javascript" src="/Scripts/jquery.signalR-0.5.3.js"></script> 
    <script type="text/javascript" src="http://<%=Request.Url.Host %>:8080/signalr/hubs"></script> 
    <title>SignalR Test</title> 
</head> 
<body> 
    <script type="text/javascript"> 
     $(function() { 

      // Wire up the client to the SignalR server on the same host 
      // as the source of this page, but on port 8080. 
      $.connection.url = "http://<%=Request.Url.Host %>:8080/signalr"; 
      var roomHub = $.connection.roomHub; 

      $('#echoButton').click(function() { 
       roomHub.echo($('#echoButton').val()) 
        .error(function (err) { 
         alert(err); 
        }); 
      }); 

      $.connection.hub.start({ transport: 'auto', xdomain: true }) 
       .done(function() { 
        console.log('Connected.'); 
       }) 
       .fail(function (e) { 
        console.log('Unable to connect:' + e); 
       }); 
     }); 
    </script> 

L': 8080/signalr/mozzi carichi di script con successo, e si guarda bene, cioè, ha la definizione per il roomHub in esso, in modo da So che il server è attivo e funzionante.

Tuttavia, quando $.connection.hub.start() corre, sembra che dovrebbe cercare di aprire una connessione per un qualcosa di URL tipo http://app.dev.alanta.com:8080/signalr/signalr/negotiate?=1353072553935. Invece, Firebug mi dice che sta ignorando la porzione 8080, e sta invece cercando di negoziare una connessione con l'URL http://app.dev.alanta.com/signalr/signalr/negotiate?=1353072553935. E, naturalmente, questo non funziona - non c'è nessun servizio SignalR in ascolto sulla porta 80, solo il normale server web - quindi fallisce con il messaggio "Impossibile connettersi: SignalR: errore durante la richiesta di negoziazione".

Devo anche notare che nel file jquery.signalR-0.5.3.js, il bit di codice che analizza il collegamento in effetti sembrano ignorare la porta:

// Resolve the full url 
parser.href = connection.url; 
if (!parser.protocol || parser.protocol === ":") { 
    connection.protocol = window.document.location.protocol; 
    connection.host = window.document.location.host; 
    connection.baseUrl = connection.protocol + "//" + connection.host; 
} 
else { 
    connection.protocol = parser.protocol; 
    connection.host = parser.host; 
    connection.baseUrl = parser.protocol + "//" + parser.host; 
} 

// Set the websocket protocol 
connection.wsProtocol = connection.protocol === "https:" ? "wss://" : "ws://"; 

È questo un bug ? O ho frainteso qualcosa?

risposta

23

Beh, potrei giurare che avevo provato questo e non ha funzionato, ma come mi è stato di risoluzione dei problemi ancora un po ', ho cambiato l'assegnazione URL da questo:

$.connection.url = "http://<%=Request.Url.Host %>:8080/signalr"; 

Per questo:

$.connection.hub.url = "http://<%=Request.Url.Host %>:8080/signalr"; 

E per sicurezza, questo è il modo in cui è documentato here. Ho pensato che l'avevo visto documentato nel modo migliore da qualche parte, ma non riesco a trovarlo ora. Oh bene. Calcola questo fino al mio non prestando abbastanza attenzione.

+0

Questa informazione è certamente mancante dal wiki corrente. –

Problemi correlati