2013-05-25 11 views
5

मैं डब्ल्यूसीएफ सेवा द्वारा भेजे गए सिग्नलआर संदेश प्राप्त करने के लिए अपना WPF क्लाइंट ऐप प्राप्त करने का प्रयास कर रहा हूं। मैंने कई चीजों की कोशिश की है और अब उम्मीदों में हैकिंग का सहारा ले लिया है कि कुछ काम करता है। मैंने ऑनलाइन ट्यूटोरियल और उदाहरणों का पालन किया है, और मुझे बस कॉल करने के लिए मेरी WPF OnSignalRMessage() विधि नहीं मिल सकती है। मैं यहाँ गलत कहां जा रहा हूं?क्लाइंट पर सिग्नलआर संदेश प्राप्त नहीं किया जा रहा है

मेरे हब:

public class PrestoHub : Hub 
{ 
    public void Send(string message) 
    { 
     Clients.All.OnSignalRMessage(message); 
    } 
} 

मेरे स्टार्टअप वर्ग:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var config = new HubConfiguration { EnableCrossDomain = true }; 

     app.MapHubs("http://localhost:8084", config); 
    } 
} 

विधि है कि (मेरे WCF सेवा मेजबान अंदर), मेरी SignalR मेजबान शुरू होता है:

private void StartSignalRHost() 
    { 
     const string url = "http://localhost:8084"; 
     WebApplication.Start<Startup>(url); 
    } 

कोड वास्तव में कुछ संदेश भेजने के लिए:

GlobalHost.ConnectionManager.GetHubContext<PrestoHub>().Clients.All.OnSignalRMessage("snuh"); 
Console.WriteLine("Sent 'snuh' to all clients..."); 

मेरे WPF ग्राहक तरीके:

private void InitializeSignalR() 
    { 
     var hubConnection = new Connection("http://localhost:8084"); 
     hubConnection.Start(); 
     hubConnection.Received += OnSignalRMessage; 
    } 

    private void OnSignalRMessage(string data) 
    { 
     MessageBox.Show(data); 
    } 

उत्तर

3

जबकि मैं अभी भी कैसे और क्यों समझने के लिए संघर्ष कर रहा हूँ, मैं यह काम कर रहा प्राप्त करने में सक्षम था। मुझे सही दिशा में इंगित करने के लिए एन टेलर मुलेन को +1। क्लाइंट साइड पर उनके सुझाव के अलावा, मुझे कुछ सर्वर कोड भी बदलना पड़ा, अर्थात् एक खाली हब और सरलीकृत स्टार्टअप क्लास का उपयोग करना।

मेरे हब:

public class PrestoHub : Hub{} 

नोट: हब खाली क्योंकि हम इसे भीतर तरीकों बुला नहीं कर रहे है। जैसा कि हम बाद में देखेंगे, हम हब संदर्भ प्राप्त करते हैं और ग्राहकों को संदेश भेजते हैं।

मेरे स्टार्टअप वर्ग:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.MapHubs(); 
    } 
} 

ऊपर कोड क्या समस्या तय हो रहा है।यह भी काम करता है:

var config = new HubConfiguration { EnableCrossDomain = true }; 
app.MapHubs(config); 

लेकिन जैसे ही मैं एक URL निर्दिष्ट के रूप में, मेरे मुवक्किल संदेश प्राप्त नहीं करता है (के साथ और "SignalR" भाग के बिना की कोशिश की):

app.MapHubs("http://localhost:8084/SignalR", config); 

विधि कि (मेरे WCF सेवा मेजबान अंदर), मेरी SignalR मेजबान शुरू होता है:

private void StartSignalRHost() 
{ 
    const string url = "http://localhost:8084"; 
    WebApplication.Start<Startup>(url); 
} 

कोड वास्तव में कुछ संदेश भेजने के लिए:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<PrestoHub>(); 
hubContext.Clients.All.OnSignalRMessage("snuh"); 

मेरे WPF ग्राहक विधि:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => 
     { 
      MessageBox.Show(data); 
     }); 
    hubConnection.Start(); 
} 
+0

कारण यूआरएल निर्दिष्ट करने से आपका एप्लिकेशन असफल हो गया: https://github.com/SignalR/SignalR/issues/962 –

+0

तो ऐसा इसलिए है क्योंकि मैं पूरा यूआरएल निर्दिष्ट कर रहा था? अगर मैं इसे बदलना चाहता हूं, तो मुझे ऐसा कुछ करने की ज़रूरत है? 'MapHubs (" ~/SignalR2 ")' –

1

आप एक PersistentConnection नहीं एक हब कनेक्शन बना रहे हैं। अपने प्रेस्टोबब से संदेश प्राप्त करने के लिए आपको पहले हबकनेक्शन से कनेक्ट करने की आवश्यकता है और फिर आपको "OnSignalRMessage" ईवेंट को संभालने की आवश्यकता है।

तो अपने ग्राहक कोड अब लगेगा जैसे:

private void InitializeSignalR() 
{ 
    var hubConnection = new HubConnection("http://localhost:8084"); 
    var prestoHubProxy = hubConnection.CreateHubProxy("PrestoHub"); 

    // Bind the "OnSignalRMessage" to a function 
    prestoHubProxy.On<string>("OnSignalRMessage", (data) => { 
     MessageBox.Show(data); 
    }); 

    hubConnection.Start(); 
} 
+0

वास्तव में होना चाहिए, उपयोग कर रहा है 'HubConnection' मेरे प्रयास से एक था। मैंने अभी आपके कोड उदाहरण की कोशिश की है और 'MessageBox.Show() 'हिट नहीं हो रहा है। –

+0

सुनिश्चित करें कि आपके MapHubs मारा जा रहा है, और यदि यह किसी वेब ब्राउज़र में http: // localhost: 8084/सिग्नल/हब्स पर जाता है और देखें कि आपको जावास्क्रिप्ट फ़ाइल मिलती है या नहीं। –

+0

MapHubs मारा जा रहा है, लेकिन वह पृष्ठ ब्राउज़र में नहीं आएगा। मैंने अभी सिग्नलआर ईबुक मुद्रित किया है। मैं इसे पढ़ूंगा और कुछ और समस्या निवारण करूँगा। सुझावों के लिए धन्यवाद। –

0

तो सर्वर साइड पर अपने तरीके अतुल्यकालिक हैं यकीन है कि वे किसी कार्य के बजाय वापसी शून्य से बनाते हैं। यही कारण है कि आप

public async Task Method(){ } 

और नहीं

public async void Method(){ } 
संबंधित मुद्दे