2013-02-25 57 views
11

我正在使用Signal20.0.0包中的VS2012「Fall」更新。調用服務器端函數可以正常工作。但是客戶端功能不會被調用。當onBroadcastMessage()(見下文)被調用時似乎沒有任何事情發生。Signalr不調用客戶端功能

問題:

  • 我缺少什麼?
  • 有沒有辦法調試客戶端調用?

謝謝!

服務器代碼:

using Microsoft.AspNet.SignalR; 

namespace KPMain 
{ 
    public class RealtimeConnectionHub : Hub 
    { 
     public void BroadcastMessage(string name, string message) { 
      Clients.All.onBroadcastMessage(name, message); 
     } 
    } 
} 

路由登記:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) { 
     HubConfiguration hubConfig = new HubConfiguration(); 
#if DEBUG 
     hubConfig.EnableDetailedErrors = true; 
#endif 
     routes.MapHubs(hubConfig); 

     ... 
    } 
} 

客戶機代碼(簡化):

var rtcom = new RealtimeConnection(); 
rtcom.init({debug: true}, function() { 
    rtcom.subscribe(function (sender, message) { 
     if (message) { 
      alert("message"); 
     } 
    }); 
}); 

RealtimeConnection: function() {  
    var 
     _rtHub = $.connection.realtimeConnectionHub, 
     _initialized = false,     
     _init = function (options, cb) { 
      options = options || {}; 

      $.connection.hub.logging = options.debug; 
      $.connection.hub.start().done(function() { 
       _initialized = true; 

       if (cb) { cb(); } 
      }); 
     }, 

     _broadcast = function (message) { 
      if (_initialized) { 
       _rtHub.server.broadcastMessage("testuser", message); 
      } 
     }, 

     _subscribe = function (cb) { 
      if (_initialized) { 
       _rtHub.client.onBroadcastMessage = cb; 
      } 
     }; 

    return { 
     initialized: _initialized, 
     broadcast: _broadcast, 
     subscribe: _subscribe, 
     init: _init 
    }; 
} 

$("#container").on("click", "button.chat-btnSendMessage", function() { 
    rtcom.broadcast($(this).parent().find("input").val()); 
}); 

日誌(使用鉻):

[16:58:01 GMT+0100 (W. Europe Standard Time)] SignalR: Negotiating with '/signalr/negotiate'. jquery.signalR-1.0.0.js:54 
[16:58:02 GMT+0100 (W. Europe Standard Time)] SignalR: Attempting to connect to SSE endpoint 'http://w2008r2portal/signalr/connect?transport=serverSentEvents&connectionT…EgDDEU0WLhHVzI7ZUnA0impltR7HYNTGHUJJYAXew1Leg2&connectionData=%5B%5D&tid=0' jquery.signalR-1.0.0.js:54 
[16:58:03 GMT+0100 (W. Europe Standard Time)] SignalR: EventSource connected jquery.signalR-1.0.0.js:54 
[16:58:03 GMT+0100 (W. Europe Standard Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332 and a connection lost timeout of 20000 


Request URL:http://xxx/signalr/send?transport=serverSentEvents&connectionToken=lnTczBgQB0dj... 
Request Method:POST 
Status Code:200 OK 

Request Headers 
Accept:application/json, text/javascript, */*; q=0.01 
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Accept-Encoding:gzip,deflate,sdch 
Accept-Language:en-US,en;q=0.8 
Authorization:Negotiate YIIFXQYGKwYBBQUCoIIFUTCCBU2... 
Connection:keep-alive 
Content-Length:148 
Content-Type:application/x-www-form-urlencoded; charset=UTF-8 
Host:w2008r2portal 
Origin:http://w2008r2portal 
Referer:http://w2008r2portal/?tab=Start 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17 
X-Requested-With:XMLHttpRequest 

Query String Parameters 
transport:serverSentEvents 
connectionToken:lnTczB... 

Form Data 
data:{"H":"realtimeconnectionhub","M":"BroadcastMessage","A":["testuser","test"],"I":0} 

Response Headers 
Cache-Control:no-cache 
Content-Type:application/json; charset=UTF-8 
Date:Mon, 25 Feb 2013 15:58:04 GMT 
Expires:-1 
Persistent-Auth:false 
Pragma:no-cache 
Server:Microsoft-IIS/7.5 
Transfer-Encoding:chunked 
WWW-Authenticate:Negotiate oYGyMIGvoAMKAQChCwY... 
X-AspNet-Version:4.0.30319 
X-Content-Type-Options:nosniff 
X-Powered-By:ASP.NET 

回答

16

因此,您的問題在於您在使用中心代理註冊任何客戶端方法之前開始連接。

有兩種方法可以解決這個問題。

  1. 在你的init之前,$ .connection.hub.start調用你的_subscribe方法。
  2. 確保在啓動之前至少定義了1個客戶端方法(要求「訂閱」傳入消息)。使用.on在啓動後訂閱集線器方法。

所以這裏是代碼中的兩種方法。

1:

var rtcom = new RealtimeConnection(); 
rtcom.init({debug: true}); 

RealtimeConnection: function() {  
    var 
     _rtHub = $.connection.realtimeConnectionHub, 
     _initialized = false,     
     _init = function (options, cb) { 
      options = options || {}; 

      $.connection.hub.logging = options.debug; 

      _rtHub.client.onBroadcastMessage = function() { 
       alert("message"); 
      }; 

      $.connection.hub.start().done(function() { 
       _initialized = true; 

       if (cb) { cb(); } 
      }); 
     }, 

     _broadcast = function (message) { 
      if (_initialized) { 
       _rtHub.server.broadcastMessage("testuser", message); 
      } 
     }, 

    return { 
     initialized: _initialized, 
     broadcast: _broadcast, 
     init: _init 
    }; 
} 

$("#container").on("click", "button.chat-btnSendMessage", function() { 
    rtcom.broadcast($(this).parent().find("input").val()); 
}); 

2:

var rtcom = new RealtimeConnection(); 
rtcom.init({debug: true}, function() { 
    rtcom.subscribe(function (sender, message) { 
     if (message) { 
      alert("message"); 
     } 
    }); 
}); 

RealtimeConnection: function() {  
    var 
     _rtHub = $.connection.realtimeConnectionHub, 
     _initialized = false,     
     _init = function (options, cb) { 
      options = options || {}; 

      // Need to have at least 1 function registered to be subscribed to hub 
      _rtHub.client.foo = function() {}; 

      $.connection.hub.logging = options.debug; 
      $.connection.hub.start().done(function() { 
       _initialized = true; 

       if (cb) { cb(); } 
      }); 
     }, 

     _broadcast = function (message) { 
      if (_initialized) { 
       _rtHub.server.broadcastMessage("testuser", message); 
      } 
     }, 

     _subscribe = function (cb) { 
      if (_initialized) { 
       _rtHub.on("onBroadcastMessage", cb); 
      } 
     }; 

    return { 
     initialized: _initialized, 
     broadcast: _broadcast, 
     subscribe: _subscribe, 
     init: _init 
    }; 
} 

$("#container").on("click", "button.chat-btnSendMessage", function() { 
    rtcom.broadcast($(this).parent().find("input").val()); 
}); 

希望這有助於!

+2

在調用start()之前定義一個客戶端函數。我應該在Signalr wiki頁面上閱讀過這些內容嗎? – mhu 2013-02-25 19:55:43

+1

好點,這個問題很常問,我會更新常見問題來解釋它。 – 2013-02-25 22:02:21

+0

在定義客戶端函數之後啓動客戶端小組在這裏解決了問題。非常感謝 ! – 2016-11-30 16:07:14