2013-11-22 16 views
10

Tôi có một trung tâm như thế này:SignalR: Gửi dữ liệu sử dụng GlobalHost.ConnectionManager không làm việc

public class MessageHubBub : Hub 
{ 

    public void ServerMethod() 
    { 
     Clients.All.sayHi("hello"); 
     GlobalHost.ConnectionManager.GetHubContext<MessageHubBub>().Clients.All.sayHi("Hello"); 
    } 
} 

của tôi (relavent) javascript trông như thế này:

$.connection.MessageHubBub.client.sayHi = function (message) { 
       console.log("Hello"); 
      }; 

      $.connection.hub.start().done(function() { 
       $.connection.MessageHubBub.server.ServerMethod(); 
      }); 

Điều thực sự lạ là " Xin chào "đang được in chỉ một lần, nơi tôi đã mong đợi nó sẽ được in hai lần (vì 'sayHello' được gọi hai lần). Nói chung, tôi đã gặp rắc rối với việc sử dụng đối tượng 'clients' thu được từ GlobalHost.ConnectionMananager để gửi tin nhắn cho khách hàng, vì vậy tôi đã chưng cất vấn đề này xuống để hiển thị những gì không hoạt động.

Tôi đã nhìn thấy rất nhiều bài đăng với những người gặp sự cố như không xem lại trình xử lý js của họ với khách hàng trước khi bắt đầu trung tâm hoặc không đưa phụ thuộc chính xác vào js, ​​nhưng đây không phải là vấn đề của tôi. Có lý do nào khiến tôi không thể gửi tin nhắn cho khách hàng bằng GlobalHost.ConnectionManager.GetHubContext().

CHỈNH SỬA: Để phản hồi lại Lars, tôi có trình phân giải phụ thuộc tùy chỉnh để tôi có thể tích hợp Unity thành SignalR. Tôi đi theo một ví dụ tôi tìm thấy ở đây: http://www.kevgriffin.com/using-unity-for-dependency-injection-with-signalr/

Dòng duy nhất của cấu hình tôi có được như sau:

RouteTable.Routes.MapHubs(new HubConfiguration() { Resolver = new SignalRUnityDependencyResolver(unityContainer) }); 

Các SignalRUnityDependencyResolver trông như thế này:

public class SignalRUnityDependencyResolver : DefaultDependencyResolver 
    { 
     private IUnityContainer _container; 

     public SignalRUnityDependencyResolver(IUnityContainer container) 
     { 
      _container = container; 
     } 

     public override object GetService(Type serviceType) 
     { 
      if (_container.IsRegistered(serviceType)) return _container.Resolve(serviceType); 
      else return base.GetService(serviceType); 
     } 

     public override IEnumerable<object> GetServices(Type serviceType) 
     { 
      if (_container.IsRegistered(serviceType)) return _container.ResolveAll(serviceType); 
      else return base.GetServices(serviceType); 
     } 

    } 
+0

Bạn có đang sử dụng trình giải quyết phụ thuộc tùy chỉnh không? Mã cấu hình SignalR của bạn trông như thế nào? –

+0

Tôi đã chỉnh sửa câu trả lời để cung cấp một số chi tiết bổ sung. – Kyle

+0

Có thể trùng lặp của [SignalR + đăng thông báo lên Hub qua phương thức hành động] (http://stackoverflow.com/questions/7549179/signalr-posting-a-message-to-a-hub-via-an-action -method) – Liam

Trả lời

24

Khi sử dụng một trình giải quyết phụ thuộc tùy chỉnh , nó không đủ để chuyển nó tới HubConfiguration.

Bạn cần phải hoặc lưu trữ các ví dụ giải quyết ở đâu đó và sử dụng nó như thế này để truy cập vào quản lý kết nối và bối cảnh trung tâm của bạn:

MyDependencyResolver.Resolve<IConnectionManager>().GetHubContext<MyHub>(); 

hoặc đặt resolver phụ thuộc mặc định trong GlobalHost để dụ của bạn:

var myResolver = new SignalRUnityDependencyResolver(unityContainer); 
RouteTable.Routes.MapHubs(new HubConfiguration() { Resolver = myResolver }); 
GlobalHost.DependencyResolver = myResolver; 

(sau đó bạn có thể sử dụng mặc định GlobalHost.ConnectionManager.GetHubContext<MessageHubBub>())

+2

Bạn là một người tiết kiệm cuộc sống! – Raghav

+1

Điều đó khiến tôi mất nhiều thời gian để tìm kiếm. Giải pháp của bạn hoạt động hoàn hảo. Cảm ơn bạn. –

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