2012-11-16 27 views
9

Tôi đang cố gắng kết hợp ứng dụng kiểu "Hello World" đơn giản với SignalR. Các yếu tố hơi phức tạp là các trung tâm SignalR cần phải được tự lưu trữ, không phải trong IIS/ASP.NET. Tôi đã làm việc phía máy chủ, cho đến khi tôi có thể nói, và nó có sẵn trên cổng 8080, nhưng tôi gặp sự cố khi kết nối máy khách. Vấn đề tôi đang gặp phải ở thời điểm hiện tại là máy khách SignalR dường như đang bỏ qua cổng trên URL mà tôi chỉ định.Máy khách SignalR js dường như đang bỏ qua cổng url

Cụ thể, tôi đã có mã này ở đây:

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

Các: 8080/signalr/hub tải kịch bản thành công, và nó có vẻ tốt, ví dụ, nó có định nghĩa cho roomHub trong nó, vì vậy Tôi biết rằng máy chủ đang hoạt động.

Tuy nhiên, khi $.connection.hub.start() chạy, có vẻ như là nên thử mở một kết nối cho URL giống như http://app.dev.alanta.com:8080/signalr/signalr/negotiate?=1353072553935. Thay vào đó, Firebug nói với tôi rằng nó bỏ qua phần 8080, và thay vào đó là cố gắng thương lượng một kết nối với URL http://app.dev.alanta.com/signalr/signalr/negotiate?=1353072553935. Và tất nhiên, điều đó không hiệu quả - không có dịch vụ SignalR nghe trên cổng 80, chỉ là máy chủ web thông thường - vì vậy nó không thành công với thông báo "Không thể kết nối: SignalR: Lỗi trong khi yêu cầu thương lượng".

Tôi cũng nên lưu ý rằng trong file jquery.signalR-0.5.3.js, các bit mã mà phân tích ra kết nối dường như thực sự để bỏ qua các cổng:

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

Đây có phải là một lỗi ? Hay tôi đã hiểu lầm điều gì đó?

Trả lời

23

Vâng, tôi có thể thề rằng tôi đã cố gắng này và nó đã không làm việc, nhưng như tôi đã xử lý sự cố đó một số chi tiết, tôi đã thay đổi sự phân URL từ này:

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

Để này:

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

Và để chắc chắn, đây là cách được ghi lại tài liệu here. Tôi nghĩ rằng tôi đã nhìn thấy nó ghi lại cách đầu tiên ở đâu đó, nhưng tôi không thể tìm thấy nó ngay bây giờ. Oh well. Viết cái này lên cho tôi không chú ý đủ.

+0

Thông tin này chắc chắn bị thiếu trong wiki hiện tại. –

Các vấn đề liên quan