2012-12-28 14 views
5

मुझे जेएस क्लाइंट विधियों का आह्वान करने के लिए सिग्नल सर्वर-साइड हब कोड प्राप्त करने में समस्या हो रही है। रिवर्स ठीक काम कर रहा है - इसलिए जब मेरा क्लाइंट सर्वर को संदेश भेजता है तो इसे अपेक्षित के रूप में वितरित किया जाता है। मैं स्पष्ट जाल से बचने के लिए काफी सावधान रहा हूं लेकिन मुझे लगता है कि मैं अभी भी कुछ दिख रहा हूं।सिग्नलआर जेएस क्लाइंट विधियों को शामिल नहीं किया गया

MessageHub.cs से::

public bool SendMessage(ClientMessage message) 
{ 
    ... 
    Clients.All.addMessage("my message"); 
    ... 
} 

जावास्क्रिप्ट: यहाँ मेरी कोड है

$.connection.hub.start() 
    .done(function() { 
     messageHub = $.connection.message; 

     // addMessage is never invoked. 
     messageHub.client.addMessage = function (message) { 
      alert('message added'); 
     }; 

     /* // I tried this based on some sample code but still not invoked. 
     messageHub.addMessage = function (message) { 
      alert('message added'); 
     }; 
     */ 

     // This works as expected. 
     messageHub.server.registerUser(userId); 
     ... 
    }); 

ऊपर उल्लेख किया है, मैं सेटअप लेकिन यहाँ के साथ किसी भी स्पष्ट कमियों नहीं मिल सकता है कुछ संभावित रूप से प्रासंगिक बिंदु हैं:

  • कनेक्शन स्थापित है और सर्वर-साइड विधियों को लागू किया जाता है।
  • यह शायद अप्रासंगिक है, लेकिन मैंने व्यवहार में कोई बदलाव किए बिना विभिन्न ट्रांसपोर्टों को मजबूर करने की कोशिश की है।
  • क्लाइंट विधि नाम किसी भी समय सर्वर विधि नामों के साथ संघर्ष नहीं करते हैं।
  • मैंने विशिष्ट क्लाइंट कनेक्शन (जो वास्तव में लक्ष्य है, इस मामले में) को संदेश भेजने का प्रयास किया है।
  • मेरे पास क्लाइंट और सर्वर दोनों पर लॉगिंग सक्षम है लेकिन किसी भी मामले में प्रासंगिक कुछ भी नहीं दिख रहा है।

तो, ऊपर दिया गया, क्या मुझे कुछ स्पष्ट याद आ रही है? यदि नहीं, विफलता बिंदु की पहचान करने का सबसे अच्छा तरीका क्या है?

पीएस यह विशेष रूप से प्रश्न से संबंधित नहीं है, हालांकि, किसी कारण से फिडलर अब मेरे किसी भी ब्राउज़र से किसी भी ट्रैफ़िक को कैप्चर नहीं कर रहा है, जो डब्लूएसएस या HTTP यातायात को थोड़ा चुनौतीपूर्ण बनाता है - मुझे लगता है कि यह विंडोज 8 चीज है ..

उत्तर

29

तो, जवाब वास्तव में काफी सरल था (हालांकि आखिरी रिलीज के बाद से मैंने 1.0.0.0-आरसी 1 से 1.0.0.0 तक अपग्रेड किया है - लेकिन मैं काफी हद तक निश्चित हूं कि इस परिदृश्य को गलत तरीके से नहीं बदला है)।

मुझे यहां जवाब मिला: https://stackoverflow.com/a/15074002/32935 (नोट, विशेष रूप से, मेरा समाधान प्रदान किए गए पहले उत्तर के लिए था - हालांकि दूसरे ने मुझे कारण की पहचान करने में मदद की)।

अनिवार्य रूप से, जो मूल उत्तर पर जाना नहीं चाहते हैं, मुझे कॉलिंग को done() कॉलबैक के विपरीत कनेक्शन के विरुद्ध कॉल करने से पहले अपने क्लाइंट विधियों को सेट करना था जैसा कि मैं कर रहा था।यहां एक उदाहरण दिया गया है:

$.connection.message.client.addMessage = function (message) { 
    alert('Now it works!'); 
}; 

$.connection.hub.start() 
    .done(function() { 
     console.log('Connection established!'); 
    }); 
+0

आपने पूरी तरह से अपना दिन बचाया, ¡thx! – vfportero

+0

बहुत बढ़िया! आपको बहुत - बहुत धन्यवाद! – Oleg

+0

यह बहुत महत्वपूर्ण टिप है !! तुमने मुझे दिन बचाया :) धन्यवाद! –

-2

जब आप क्लाइंट ऑब्जेक्ट पर होवर करते हैं, तो क्या आप जेएस में परिभाषित सभी कार्यों को देखते हैं?

वैसे भी, मुझे यकीन नहीं है कि आपका तरीका क्यों काम नहीं करता है, लेकिन इस तरह मैंने अपने ग्राहक पक्ष को लिखा है, और यह काम करता है। शायद आप इस तरह से कोशिश कर सकते हैं।

$(function() { 

    var hub = $.connection.RatesHub; 


    $.connection.hub.start().done(function() { 
     /*Logic goes here*/ 
    }); 

    $.extend(hub.client, { 
     FuncName: function (msg) { 
      /*Logic goes here*/ 
     } 
    }); 

} 

किसी भी समारोह आप अपने सर्वर में मान्यता प्राप्त होना चाहते हैं, $ .extend का उपयोग करें।

उम्मीद है कि मदद करता है।

+0

आपकी स्थिति में यह काम करने का कारण यह है क्योंकि $ .extend पूर्ण विधि के कॉलबैक कहने से पहले समाप्त हो रहा है। यह एक दौड़ की स्थिति की ओर जाता है कि यदि कोई ईवेंट प्रारंभ() कॉल और $ .extend (जो हो सकता है) के बीच निष्पादन को अवरुद्ध करने के लिए होता है, तो कोई भी तरीका सिग्नलर तक पहुंच योग्य नहीं होगा। –