2013-08-27 27 views
6

Gần đây tôi đã nâng cấp một dự án từ SignalR 2.0.0-beta1 lên 2.0.0-rc1. Tôi hiểu rằng trong RC1, cấu hình hỗ trợ cho các yêu cầu miền chéo đã thay đổi. Tôi đã cập nhật dự án của tôi để sử dụng cú pháp mới tuy nhiên bây giờ tôi đang nhận được lỗi sau khi cố gắng liên lạc với trung tâm của tôi:Yêu cầu miền chéo không hoạt động trong SignalR 2.0.0-rc1

XMLHttpRequest không thể tải = 1377623738064" > http: // localhost: 8080/đàm phán? connectionData =% 5B% 7B% 22name% 22% 3A% 22chathub% 22% 7D% 5D & clientProtocol = 1,3 & = 1377623738064. xứ http://localhost:7176 không được phép bởi Access-Control-Allow-Origin.

Trang web của khách hàng đang chạy tại http://localhost:7176 và trung tâm đang nghe qua bảng điều khiển ứng dụng điện tử tại http://localhost:8080. Am i thiếu cái gì ở đây? Yêu cầu miền chéo đã hoạt động trước khi tôi nâng cấp lên RC1.

CONSOLE APP ENTRY POINT

static void Main(string[] args) 
{ 
    var chatServer = new ChatServer(); 
    string endpoint = "http://localhost:8080"; 

    chatServer.Start(endpoint); 

    Console.WriteLine("Chat server listening at {0}...", endpoint); 
    Console.ReadLine(); 
} 

CHATSERVER CLASS

public class ChatServer 
{ 
    public IDisposable Start(string url) 
    { 
     return WebApp.Start<Startup>(url); 
    } 
} 

STARTUP CẤU HÌNH

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.Map("/signalr", map => 
     { 
      map.UseCors(CorsOptions.AllowAll); 
      map.RunSignalR(new HubConfiguration { EnableJSONP = true }); 
     }); 
    } 
} 

Trả lời

8

Đã xảy ra sự cố với cấu hình ứng dụng khách của bạn.

XMLHttpRequest cannot load =1377623738064">http://localhost:8080/negotiate?connectionData=%5B%7B%22name%22%3A%22chathub%22%7D%5D&clientProtocol=1.3&=1377623738064. Origin http://localhost:7176 is not allowed by Access-Control-Allow-Origin.

Yêu cầu đàm phán nên được thực hiện để http://localhost:8080/signalr/negotiate?... không http://localhost:8080/negotiate?.... Để khắc phục điều này, bạn có thể thử các sau đây trước khi bạn gọi $ .connection.hub.start:

$.connection.hub.url = http://localhost:8080/signalr;

+0

Tôi biết điều đó đôi khi hing ngu ngốc. Tôi đã quá tập trung vào thực tế là tôi đã thay đổi cách tiếp cận để vượt qua cấu hình miền tôi đã không nhận ra tôi đã vô tình thay đổi một cái gì đó khác là tốt. Cảm ơn. – Scott

+0

Vì vậy, cách tốt nhất để xử lý miền chéo trong signalR khi có nhiều môi trường liên quan đến phía máy chủ, v.d. dev, uat và sản xuất? Tôi có nghĩa là có cách nào ngoài việc tự thay đổi kết nối trung tâm trong mỗi tập tin hub tạo ra? – stt106

8

Không chắc chắn nếu câu hỏi này đã được trả lời đầy đủ, nhưng tôi đã thực hiện những thay đổi sau đây để các mẫu được cung cấp bởi Microsoft :

public void Configuration(IAppBuilder app) 
     { 
      var config = new HubConfiguration(); 
      config.EnableJSONP = true; 
      app.MapSignalR(config); 
     } 

Và tôi đã thêm dòng sau vào mẫu JS:

$.connection.hub.start({ jsonp: true }).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(); 
    }); 
}); 

Và bây giờ là tên miền chéo kịch bản được kích hoạt. Hy vọng điều này sẽ giúp người khác, tôi đã thực sự khó hiểu với nó một lúc.

+0

Điều này phù hợp với tôi. Cảm ơn rất nhiều! –

+0

Nhìn tất cả các câu trả lời, và may mắn tìm thấy câu trả lời của bạn. Cảm ơn! –

+0

{jsonp: true} Upvote cho việc này. Liệu nó có foce để sử dụng json? hoặc nó chỉ cho phép nó được sử dụng? – Tauseef

3

Salam.

cho Microsoft.Owin 2.x trở lên:

Thêm Microsoft.Owin.Cors gói qua NuGet bởi lệnh này trong Package Manager console:

PM> Install-Package Microsoft.Owin.Cors 

và sau đó using gói này trong tập tin Startup lớp:

using Microsoft.Owin; 
using Microsoft.Owin.Cors; 

sau đó thay đổi mã nguồn của bạn như thế này:

// app.MapHubs(new HubConfiguration { EnableCrossDomain = true }); 
app.UseCors(CorsOptions.AllowAll); 
app.MapSignalR(); 
+0

Trong SiganlR 2.2: app.UseCors() không còn nữa. – nashwan

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