2013-01-11 35 views
16

मैं सिग्नल में एक गेम लिख रहा हूं। विचार यह है कि आप अपने लैपटॉप से ​​कनेक्ट होते हैं, जिसका उपयोग "डिस्प्ले" के रूप में किया जाएगा और फिर आप अपने स्मार्ट फोन से कनेक्ट होंगे और इसका उपयोग "जॉयस्टिक" के रूप में किया जाएगा। पूरा सेटअप बहुत अच्छी तरह से काम करता है।सिग्नलआर: हब ऑन कनेक्ट नहीं किया गया है अगर कोई क्लाइंट विधियां

अब यह सब काम करता है, मैंने कोड को दोबारा करने का फैसला किया। मुझे एहसास हुआ कि जॉयस्टिक और डिस्प्ले के बीच का रिश्ता एक तरीका है (प्रदर्शन को जॉयस्टिक पर जानकारी भेजने की आवश्यकता नहीं है)। इसलिए मैंने तय कर लिया है कि मैं (जैसे जॉयस्टिक js में gameHub.client.joyStickMethod() के लिए किसी काम का नहीं है जॉयस्टिक पर किसी भी signalR invokable ग्राहक कार्यों जरूरत नहीं थी।

यह तो मैं कुछ अजीब

की खोज की थी ऐसा लगता है कि हब विधि public override Task OnConnected() कि मैं ग्राहकों (प्रदर्शित करता है और जॉयस्टिक) के विभिन्न प्रकार से निपटने के लिए ओवरराइड लागू नहीं है जब तक कि मैं एक myHub.client.clientSideMethod() परिभाषित यहाँ उदाहरण मैं के साथ काम कर रहा हूँ है:।

 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 

आप खाली ग्राहक कि देखना साइड विधि? यही कारण है कि OnConnected सर्वर पक्ष पर बुलाया जाता है। अगर मैं कोड की उस पंक्ति को हटा देता हूं, तो इसे नहीं कहा जाएगा।

 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 

यह काम नहीं करेगा, क्योंकि हब पर कोई क्लाइंट साइड विधि नहीं है। मैं शायद हब पर RegistrateJoystick विधि जोड़ सकता हूं और उसे कॉल कर सकता हूं, लेकिन मुझे लगता है कि व्यवहार अप्रत्याशित है। मेरा सवाल इसलिए है:

क्या हब में मैन्युअल रूप से "कनेक्ट" करने का कोई तरीका है, ताकि OnConnect विधि को कॉल किया जा सके?

उत्तर

14

यह डिज़ाइन द्वारा है। यदि आपके पास हब के लिए कोई सदस्यता नहीं है तो उस विशेष ग्राहक को सर्वर से क्लाइंट तक कोई संदेश नहीं मिलेगा। आप अभी भी हब पर विधियों का आह्वान कर सकते हैं।

+6

आपके उत्तर के लिए धन्यवाद।मैं जो कह रहा हूं उसमें तर्क समझता हूं, लेकिन साथ ही, सर्वर साइड विधि "ऑनकनेक्ट" का नाम मुझे लगता है कि इससे कोई फर्क नहीं पड़ता कि आपके क्लाइंट के पास अनावश्यक तरीके हैं या नहीं। – pardahlman

+1

निश्चित रूप से, लेकिन ऐसा नहीं है कि यह कैसे काम करता है। और विधि ऑनकनेक्टेड है। – davidfowl

+1

सिर्फ पर्डहलमैन ने गूंजने के लिए कहा कि नामकरण के बाद थोड़ा सा अंतर्ज्ञानी कहता है, भ्रम से बचने के लिए दस्तावेज़ों में इसे स्पष्ट रूप से कॉल करने के लायक हो सकता है। –

1

इसके आस-पास एक तरीका है कि आप एक नकली हब है जिसे आप तार करते हैं। कुछ भी नहीं, शून्य लौटाता है। कम से कम इस तरह, जब आप कनेक्शन पर .start() को कॉल करने से पहले अपने गेम को बूटस्ट्रैप करते हैं, तो आप फर्जी हब पर इस नकली विधि को तार देते हैं। यह आपको ऑनकनेक्टेड() विधि प्राप्त करेगा।

मैं मानता हूं, यह इतना अजीब व्यवहार है। यदि आप कनेक्शन बनाते हैं, तो कनेक्ट() को उठाया जाना चाहिए, भले ही आप ईवेंट सुन नहीं रहे हों।

यदि आप हब प्रमाणीकरण कर रहे हैं तो यह और भी अजीब बात है। यदि आप AuthorizeAttribute से प्राप्त करते हैं, तो आपके मामले में, AuthorizeHubMethodInvokation() को क्लाइंट पर कॉल की जाने वाली प्रत्येक विधि के लिए बुलाया जाएगा, लेकिन AuthorizeHubConnection() को कभी भी नहीं कहा जाएगा।

--Update

मैं अपने प्रोजेक्ट पर इस के साथ चारों ओर खेला। मुझे क्लाइंट पर एक हब प्रॉक्सी बनाने का अनौपचारिक विचार था जो सर्वर पर मौजूद नहीं है, लेकिन यह विफल रहता है। हालांकि, आप केवल वास्तविक केंद्र पर नकली कॉलबैक कर सकते हैं। यह काम करता है और आपको वास्तविक विधि बनाने से दूर जाने देता है।

यह स्पष्ट रूप से एक भयानक काम है, लेकिन कुछ भी नहीं, नौकरी करता है।