2013-01-11 25 views
16

Tôi đang viết một trò chơi trong SignalR. Ý tưởng là bạn kết nối với máy tính xách tay của bạn, mà sẽ được sử dụng như là "hiển thị" và sau đó bạn kết nối với điện thoại thông minh của bạn và đó sẽ được sử dụng như "phím điều khiển". Toàn bộ thiết lập hoạt động rất tốt.SignalR: Hub OnConnected không được gọi nếu không có phương thức máy khách

Bây giờ tất cả đều hoạt động, tôi đã quyết định tái cấu trúc mã. Tôi nhận ra rằng mối quan hệ giữa cần điều khiển và màn hình hiển thị là một cách (màn hình không bao giờ cần gửi thông tin trở lại cần điều khiển). Vì vậy, tôi quyết định rằng tôi không cần bất kỳ chức năng client invokable signalR trên phím điều khiển (ví dụ như không có sử dụng cho gameHub.client.joyStickMethod() trong js phím điều khiển.

Nó được sau đó tôi phát hiện ra một cái gì đó kỳ lạ

Nó chỉ ra rằng trung tâm phương pháp public override Task OnConnected() mà tôi ghi đè lên để đối phó với các loại khác nhau của khách hàng (hiển thị và cần điều khiển) không được gọi trừ khi tôi định nghĩa một myHub.client.clientSideMethod() Dưới đây là ví dụ tôi đang đối phó với:.

 var gameHub = $.connection.gameHub; 
     gameHub.client.connection(); 
     $("#joystick").joystick({ 
      hub: gameHub 
     }); 

     gameHub.client.activateJoystick = function() { }; 
     $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id"; 
     $.connection.hub.start(); //this will invoke on connected 

Bạn thấy rằng khách hàng có sản phẩm nào phương pháp phụ? Đó là lý do tại sao OnConnected được gọi ở phía máy chủ. Nếu tôi loại bỏ dòng mã đó, nó sẽ không được gọi.

 var gameHub = $.connection.gameHub; 
     gameHub.client.connection(); 
     $("#joystick").joystick({ 
      hub: gameHub 
     }); 

     //gameHub.client.activateJoystick = function() { }; 
     $.connection.hub.qs = "type=joystick&gameId=" + "@Model.Id"; 
     $.connection.hub.start(); //this will invoke on connected 

Điều này sẽ không hoạt động do không có phương thức phía máy khách trên Hub. Tôi có lẽ có thể thêm một phương pháp RegistrateJoystick trên Hub và gọi đó, nhưng tôi nghĩ rằng hành vi này là bất ngờ. Do đó, câu hỏi của tôi là:

Có cách nào để "kết nối" thủ công với trung tâm, để phương thức OnConnect sẽ được gọi?

Trả lời

14

Đó là theo thiết kế. Nếu bạn không có bất kỳ đăng ký nào cho hub thì client đó sẽ không nhận được bất kỳ tin nhắn nào từ máy chủ đến máy khách. Bạn vẫn có thể gọi các phương thức trên hub.

+6

Cảm ơn bạn đã trả lời.Tôi hiểu logic trong những gì bạn đang nói, nhưng đồng thời, tên của phương thức phía máy chủ "OnConnect" âm thanh với tôi rằng nó sẽ được gọi là không có vấn đề nếu khách hàng của bạn có phương pháp invokable hay không. – pardahlman

+1

Chắc chắn, nhưng đó không phải là cách nó hoạt động. Và phương pháp này là OnConnected. – davidfowl

+1

Chỉ cần lặp lại những gì pardahlman nói một chút không trực quan của nó cho việc đặt tên, có thể là giá trị gọi nó ra khá rõ ràng trong tài liệu để tránh nhầm lẫn. –

1

Một cách xung quanh việc này là chỉ có một Hub giả mà bạn kết nối tới. Không có gì, trả về void. Ít nhất theo cách này, khi bạn khởi động trò chơi của mình, trước khi bạn gọi .start() trên kết nối, bạn kết nối với phương thức giả này trên trung tâm giả mạo. Điều này sẽ giúp bạn có được phương thức onConnected().

Tôi đồng ý, đây là hành vi kỳ quặc như vậy. Nếu bạn thực hiện một kết nối, onConnected() sẽ được nâng lên, ngay cả khi bạn không nghe các sự kiện.

Điều gì khiến điều này còn kỳ quặc hơn nữa là nếu bạn đang thực hiện ủy quyền Hub. Nếu bạn lấy được từ AuthorizeAttribute, trong trường hợp của bạn, AuthorizeHubMethodInvokation() sẽ được gọi cho mỗi phương thức mà bạn gọi trên máy khách, nhưng AuthorizeHubConnection() sẽ không bao giờ được gọi.

--Cập nhật

Tôi đã thử nghiệm với dự án này. Tôi đã có ý tưởng iniital của việc tạo ra một proxy trung tâm trên máy khách mà không tồn tại trên máy chủ, nhưng điều này không thành công. Tuy nhiên, bạn chỉ có thể kết nối với một trung tâm thực sự thực tế nhưng gọi lại giả mạo. Điều này làm việc và cho phép bạn thoát khỏi việc tạo ra một phương pháp thực sự.

Điều này rõ ràng là một công việc kinh khủng xung quanh, nhưng khi đối mặt với không có gì khác, thực hiện công việc.

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