2012-11-16 7 views
9

Próbuję stworzyć prostą aplikację stylu "Hello World" z SignalR. Nieco skomplikowanym czynnikiem jest to, że huby SignalR muszą być hostowane samodzielnie, a nie w IIS/ASP.NET. Mam działającą po stronie serwera, o ile wiem, i jest dostępna na porcie 8080, ale mam problem z okablowaniem klienta. Problem w tym momencie polega na tym, że klient SignalR wydaje się ignorować port pod podanym adresem URL.Klient SignalR js wydaje się ignorować port url

Konkretnie, mam ten kod tutaj:

<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> 

: 8080/signalr/piasty ładunki skryptów powodzeniem, i wygląda dobrze, to znaczy, że ma definicję dla roomHub w nim, tak Wiem, że serwer działa i działa.

Jednak gdy $.connection.hub.start() działa, wydaje się, że powinien spróbować otworzyć połączenie do adresu URL coś podobnego http://app.dev.alanta.com:8080/signalr/signalr/negotiate?=1353072553935. Zamiast tego Firebug mówi mi, że ignoruje część 8080 i zamiast tego próbuje negocjować połączenie z adresem URL: http://app.dev.alanta.com/signalr/signalr/negotiate?=1353072553935. I oczywiście to nie działa - nie ma usługi SignalR nasłuchującej na porcie 80, tylko zwykły serwer sieciowy - więc kończy się niepowodzeniem z komunikatem "Nie można się połączyć: SignalR: Błąd podczas żądania negocjacji".

Należy również pamiętać, że w pliku jquery.signalR-0.5.3.js bit kodu, który analizuje się połączenie rzeczywiście zdają się ignorować portu:

// 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://"; 

Jest to błąd ? A może coś źle zrozumiałem?

Odpowiedz

23

Cóż, mógłbym przysiąc, że będę próbował tego i to nie działa, ale jak byłem rozwiązywania go trochę więcej, zmieniłem przypisanie adresu URL z tego:

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

do tego:

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

I na pewno, tak to jest udokumentowane here. Wydawało mi się, że widziałem, jak to udokumentowano, ale nie mogę tego teraz znaleźć. No cóż. Pokieruj tym do moich nie zwracając wystarczającej uwagi.

+0

Ta informacja z pewnością nie jest dostępna w bieżącym wiki. –