2015-05-20 21 views
8

मैं आज सिग्नल के साथ प्रयोग कर रहा हूं और यह वास्तव में साफ है। असल में जो मैं प्राप्त करना चाहता था वह निम्नलिखित है:सिग्नलआर - संदेश भेजें ऑनकनेक्टेड

जैसे ही कोई डिवाइस कनेक्ट होता है, उसे पहले संदेश को भेजना चाहिए। यदि 1 कनेक्टेड से अधिक डिवाइस हैं तो मैं दो संदेश भेजना चाहता हूं। अंतिम कनेक्ट क्लाइंट को छोड़कर सभी पर एक। और एक संदेश केवल अंतिम कनेक्ट क्लाइंट के लिए एक संदेश।

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

मैं जैसे ही एक युक्ति किसी भी उपयोगकर्ता सहभागिता के बिना OnConnected भीतर जोड़ता है संदेश भेजने के लिए चाहते हैं, लेकिन जब मैं OnConnected ओवरराइड अंदर मेरे कोड जगह यह काम करना बंद। यह अब विशिष्ट ग्राहकों को नहीं भेजता है (पहले कनेक्ट और आखिरी जुड़ा हुआ)।

मुझे उम्मीद है कि कोई मेरी मदद करने में सक्षम है, क्योंकि मैं अब कुछ घंटों के लिए अपने सिर पर टक्कर लगी हूं।

public override System.Threading.Tasks.Task OnConnected() 
    { 
     UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1); 

     int amountOfConnections = UserHandler.ConnectedIds.Count; 
     var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault(); 
     var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList(); 

     if (amountOfConnections == 1) 
     { 
      Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one"); 
     } 
     else 
     { 
      Clients.Clients(allExceptLast).hello("Send to everyone except last"); 
      Clients.Client(lastConnection.Key).hello("Send to only the last one"); 
     } 

     return base.OnConnected(); 
    } 

उत्तर

4

सभी मदद के लिए धन्यवाद (आप लोगों को ऊपर उठाया गया)। असल में समस्या मिली .. यह मेरे ग्राहक के अंदर था। मैंने पहली बार 'हैलो' फ़ंक्शन की सदस्यता ली और उसके बाद मैंने हबकनेक्शन शुरू किया। जैसे ही मैंने यह आदेश बदल दिया, सब ठीक काम किया।

यह निम्न क्लाइंट कोड के साथ काम किया:

private async Task ConnectToSignalR() 
    { 
     var hubConnection = new HubConnection("url"); 
     hubConnection.Headers["x-zumo-application"] = "clientapikey"; 

     IHubProxy proxy = hubConnection.CreateHubProxy("ChatHub"); 

     proxy.On<string>("hello", async (msg) => 
     { 
      Console.WriteLine(msg); 
     }); 

     await hubConnection.Start(); 
    } 
1

ठीक है ... आप एक काम लौट रहे हैं ... तो मैं लगता है कि मुद्दा हो सकता है ... आप पहली बार अपने कोड निष्पादित करना चाहिए और उसके बाद कार्य लौट ... या एक ContinueWith डाल दिया। .. की तरह ...

public override Task OnConnected() 
    { 
     Task task = new Task(() => 
      { 
       UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1); 

       int amountOfConnections = UserHandler.ConnectedIds.Count; 
       var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault(); 
       var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList(); 

       if (amountOfConnections == 1) 
       { 
        Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one"); 
       } 
       else 
       { 
        Clients.Clients(allExceptLast).hello("Send to everyone except last"); 
        Clients.Client(lastConnection.Key).hello("Send to only the last one"); 
       } 
      }); 

     task.ContinueWith(base.OnConnected()); 

     return task; 
    } 

मैं परीक्षण नहीं किया है कि ... इसके सिर्फ एक अनुमान ..

3

जब से तुम अभी तक एक कनेक्शन स्थापित नहीं किया है, के भीतर अपने ग्राहक .hello() समारोह कॉल करने का प्रयास इस बिंदु पर OnConnected संभव नहीं है। हालांकि, हम एक सर्वर हब विधि को परिभाषित कर सकते हैं और तुरंत हमारे कनेक्शन .done कॉलबैक पर कॉल कर सकते हैं। फिर, हमारी नई सर्वर विधि में हम वर्तमान में OnConnected में आपके द्वारा तर्कित तर्क को पुन: आवंटित कर सकते हैं।

यह हमारे सेटअप काफ़ी बदल जाएगा और कुछ अतिरिक्त चरण परिचय है, लेकिन निम्न उदाहरण का पालन ...

// WhateverHub 
public override Task OnConnected() 
{ 
    return base.OnConnected() 
} 

public void AfterConnected() 
{ 
    // if(stuff) -- whatever if/else first user/last user logic 
    // { 
     Clients.Caller.hello("message") 
    // } 
} 

var proxy= $.connection.whateverHub; 

proxy.client.hello = function(message) { 
    // last step in event chain 
} 

$.connection.hub.start().done(function() { 
    proxy.server.afterConnected() // call AfterConnected() on hub 
}); 

तो यहाँ मूल विचार पहले

है
  1. कनेक्ट =>.done(function() { ... });
  2. कॉल server.afterConnected()
  3. कि विधि
  4. भीतर तर्क निष्पादित हम संतुष्ट स्थिति हमारे .hello() ग्राहक फ़ंक्शन को कॉल के साथ कर रहे हैं

नोट - इस कार्यान्वयन के लिए JavaScript ग्राहक के लिए है - लेकिन एक ही विचार कर सकते हैं एक .net क्लाइंट में अनुवाद किया जाना चाहिए। यह ज्यादातर एक वास्तुकला मुद्दा है।

10

जब तक मैं अपने प्रश्न से कुछ याद आती है, समाधान बहुत मेरे लिए आसान लग रहा है, तो आप सिर्फ

Clients.Caller.hello("Send to only the last one"); 

का उपयोग कर के बजाय अपने आप को समझने के लिए पिछले जुड़ा आईडी है जो कोशिश कर रहा करने के लिए स्विच की जरूरत है। अन्य लोगों के लिए एक ही है, तो आप उपयोग कर सकते हैं:

Clients.Others.hello("Send to everyone except last"); 

आप सभी तर्क की जरूरत नहीं है आप सेटअप, उन 2 लाइनों है कि तुम क्या आवश्यकता है, और वे OnConnected अंदर काम करते हैं।

+0

धन्यवाद इस कोड के लिए बहुत कुछ। यह वास्तव में मेरे कोड को बहुत आसान बनाता है! – Mittchel

संबंधित मुद्दे