2013-02-25 29 views
11

मैं सिग्नल 1.0.0 पैकेज के साथ VS2012 "पतन" अपडेट का उपयोग कर रहा हूं। कॉलिंग सर्वर साइड फ़ंक्शंस ठीक काम करता है। हालांकि ग्राहक कार्यों को नहीं कहा जाता है। ऐसा नहीं लगता है जब onBroadcastMessage() (नीचे देखें) कहा जाता है।सिग्नलर क्लाइंट साइड फ़ंक्शंस को कॉल नहीं करता

सवाल:

  • मैं क्या याद आ रही है?
  • क्या क्लाइंट कॉल डीबग करने का कोई तरीका है?

धन्यवाद!

सर्वर कोड:

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. $ .connection.hub.start से पहले अपने init में अपनी _ सदस्यता विधि को कॉल करें।
  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

कॉल() काम करने से पहले क्लाइंट फ़ंक्शन को परिभाषित करना। क्या मुझे इसे सिग्नल विकी पेज पर पढ़ना चाहिए? – mhu

+1

अच्छा बिंदु, यह सवाल अक्सर पूछताछ की जाती है, मैं इसके लिए खाते में अक्सर पूछे जाने वाले प्रश्न अपडेट करूंगा। –

+0

ग्राहक कार्यों को परिभाषित करने के बाद क्लाइंट बब शुरू करने से समस्या हल हो गई। बहुत धन्यवाद ! –