2013-03-12 33 views
13

LƯU Ý: Ai đó đã hỏi câu hỏi này nhưng đã xóa nó trước khi tôi có thể đăng câu trả lời của mình. Vì câu hỏi này đề cập đến nhiều vấn đề mà các nhà phát triển phải đối mặt khi cố gắng làm cho SignalR làm việc giữa nhiều miền, tôi quyết định tái tạo nó. Thêm vào đó, tôi đã viết xong câu trả lời!Tên miền chéo sẽ không hoạt động với SignalR PersistentConnection

Tôi đang chạy máy chủ SignalR 1.0.1 trong dự án ASP.NET MVC .NET Framework 4. Tôi có một ứng dụng ASP.NET khác trên một miền khác (cổng localhost khác nhau) cố gắng kết nối thông qua trình khách JavaScript. Tôi có được điều này khi ứng dụng của tôi cố gắng kết nối:

XMLHttpRequest cannot load http://localhost:31865/api/negotiate?_=1363105027533. 
Origin http://localhost:64296 is not allowed by Access-Control-Allow-Origin. 

Tôi đã theo tất cả các bước để cho phép hỗ trợ cross-domain với SignalR - những gì tôi bị mất?

  • jQuery.support.cors = true;
  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true });
  • RouteTable.Routes.MapHubs(new HubConfiguration { EnableCrossDomain = true });
  • RouteTable.Routes.MapConnection<ApiConnection>("/api", "api");

Tôi cũng đã thêm dòng sau vào Web.config trong dự án API:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
    </httpProtocol> 
</system.webServer> 

Tôi u hát một PersistentConnection cho máy chủ SignalR của tôi, không phải hub.

Bất kỳ ý tưởng nào?

+0

Xin chào @ halter73, bạn có thể cung cấp cho tôi bản trình diễn cho nhiều phòng trò chuyện sử dụng signalR hay không. Tôi muốn triển khai máy chủ trò chuyện như chat.stackoverflow.com HOẶC bất kỳ liên kết nào. Làm ơn giúp tôi. tôi có một bản demo nhưng không hoạt động. có thể gửi email cho bạn bản demo của tôi không? –

+0

id email của tôi là: [email protected] nếu bạn có bất kỳ bản demo xin vui lòng gửi cho tôi. –

Trả lời

15

MapHubs sẽ định cấu hình điểm cuối tại/signalr để liên lạc với tất cả các lớp Hub của bạn. Vì bạn không sử dụng Hub, nên gọi tới MapHubs là không cần thiết. Cuộc gọi đến MapHubs cũng không ảnh hưởng đến cấu hình kết nối/api của bạn.

Cuộc gọi của bạn để MapConnection nên được thay đổi để đọc như sau:

RouteTable.Routes.MapConnection<ApiConnection>("api", "api", 
    new ConnectionConfiguration { EnableCrossDomain = true }); 

LƯU Ý: Đối số thứ hai để MapConnection là URL. Đối số đầu tiên là tên tuyến đường. Các / là không cần thiết, nhưng không thực sự bị tổn thương trong cả hai trường hợp.

  • Thiết jQuery.support.cors = true; nên CHỈ được thực hiện "Để kích hoạt yêu cầu miền chéo trong môi trường không hỗ trợ CORS chưa nhưng đừng cho phép yêu cầu XHR cross-domain (cửa sổ tiện ích, vv)" [1]. Điều này không liên quan đến bất kỳ phiên bản nào của IE hoặc bất kỳ trình duyệt nào khác mà tôi biết. Nếu trình duyệt không hỗ trợ CORS, SignalR sẽ tự động quay trở lại JSONP trừ khi bạn đặt jQuery.support.cors thành true.

    Nếu bạn chỉ thiết lập điều này thành đúng một cách mù quáng, SignalR sẽ giả định rằng môi trường hỗ trợ yêu cầu XHR nhiều miền và không tự động quay lại hiển thị JSONP SignalR không thể thiết lập kết nối miền chéo trong khi chạy trong trình duyệt thực sự không hỗ trợ CORS.

  • $.connection('http://localhost:31865/api', '', false, { jsonp: true, xdomain: true }); không chính xác.Bạn chỉ nên cần

    var connection = $.connection('http://localhost:31865/api'); 
    

    xdomain không còn một lựa chọn cho khách hàng SignalR JS, và nếu bạn thực sự muốn chỉ định jsonp, bạn nên làm điều đó khi bạn start kết nối như vậy:

    connection.start({ jsonp: true}).done(function() { /* ... */ }); 
    

    Tôi nên nhắc lại rằng SignalR sẽ tự động quay trở lại JSONP nếu môi trường không hỗ trợ CORS, vì vậy bạn không được chỉ định phương thức này tion mình. JSONP không yêu cầu tiêu đề Access-Control-Allow-Origin, nhưng nó buộc SignalR sử dụng phương tiện vận chuyển kém hiệu quả nhất: bỏ phiếu dài.

  • Bạn không cần phải thiết lập customHeaders trong Web.config của mình. SignalR sẽ đặt tiêu đề Access-Control-Allow-Origin trong SignalR phản hồi tự động khi bạn đặt EnableCrossDomain thành true trong số ConnectionConfiguration.

Tham chiếu https://github.com/SignalR/SignalR/wiki/QuickStart-Persistent-Connections để được tư vấn thêm về việc sử dụng PersistentConnections.

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