2016-04-30 7 views
12

मेरे पास एक स्वयं-होस्ट किया गया सिग्नलआर एप्लिकेशन है जो कंसोल ऐप के संदर्भ में चल रहा है। मैं अपने एएसपी.नेट परियोजना से सिग्नलआर। कॉयर असेंबली का संदर्भ देने से रोकने के लिए एक रैपर वर्ग के उपयोग के माध्यम से इसके अंदर हब्स से जुड़ रहा हूं। तो यह मेरे आवेदन के भीतर से एक और सी # वर्ग है जो कनेक्ट किए गए ग्राहकों को संदेशों को प्रसारित करने के लिए ज़िम्मेदार है।सिग्नलआर 2.2 क्लाइंट कोई संदेश नहीं प्राप्त कर रहे हैं

मैं जावास्क्रिप्ट से सीधे PlanHub विधियों (Register और Unregister) कॉल करने में सक्षम हूँ, उन breakpoints हिट मिलता है। हालांकि, जब मैं समूह पंजीकरण के साथ समस्याओं को खत्म करने के लिए हब के बाहर कक्षा से ग्राहक विधियों को कॉल करता हूं (भले ही मैं Clients.All का उपयोग समूह पंजीकरण के साथ समस्याओं को खत्म करने के लिए करता हूं), ग्राहकों को कभी संदेश नहीं मिलता है। मैं क्या गलत कर रहा हूं?

इस कोड को चलाने पर, मैं सत्यापित कर सकता हूं कि Clients.All.updateStatus(planId, message); कोड सफलतापूर्वक मारा जा रहा है, लेकिन ग्राहक पर कंसोल के लिए कुछ भी लॉग नहीं है।

यहाँ प्रासंगिक कोड है:

PlanHub.cs

public class PlanHub : Hub 
{ 
    private const string GroupPrefix = "PlanGroup_"; 

    public void Register(int companyId) 
    { 
     Groups.Add(Context.ConnectionId, $"{GroupPrefix}{companyId}"); 
    } 

    public void Unregister(int companyId) 
    { 
     Groups.Remove(Context.ConnectionId, $"{GroupPrefix}{companyId}"); 
    } 
} 

PlanPublisher.cs

public class PlanPublisher 
{ 
    private readonly static Lazy<PlanPublisher> _instance = new Lazy<PlanPublisher>(() => 
     new PlanPublisher(GlobalHost.ConnectionManager.GetHubContext<PlanHub>().Clients)); 
    private IHubConnectionContext<dynamic> Clients { get; set; } 

    private PlanPublisher(IHubConnectionContext<dynamic> clients) 
    { 
     Clients = clients; 
    } 

    public static PlanPublisher Instance => _instance.Value; 

    public void UpdateStatus(int planId, string message) 
    { 
     //This code gets hit and no exceptions are thrown, but the clients 
     //never receive the message. Using Clients.All instead of my 
     //Groups for testing -- still doesn't work 
     Clients.All.updateStatus(planId, message); 
    } 
} 

(एक और सी # वर्ग के भीतर से) कोड कॉलिंग

PlanPublisher.Instance.UpdateStatus(plan.Id, $"Publishing started for {plan.Name}..."); 

जावास्क्रिप्ट

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> 
<script src="~/scripts/jquery.signalR-2.2.0.min.js"></script> 
<script src="http://localhost:8080/signalr/hubs"></script> 
<script> 
    $(document).ready(function() { 
     $.connection.hub.url = "http://localhost:8080/signalr"; 

     var planMessagePublisher = $.connection.planHub; 

     planMessagePublisher.client.updateStatus = function (planId, message) { 
      console.log('Status: ' + planId + ' - ' + message); 
     }; 

     $.connection.hub.start().done(function() { 
      //This works! My PlanHub.Register method gets called successfully 
      planMessagePublisher.server.register(@Model.CompanyId); 

      // New connection ID is successfully sent to console 
      console.log('Now connected, connection ID=' + $.connection.hub.id); 
     }); 
    }); 
</script> 

जे एस कंसोल डीबगर आउटपुट

jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Auto detected cross domain url. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Client subscribed to hub 'planhub'. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Negotiating with 'http://localhost:8080/signalr/negotiate?clientProtocol=1.5&connectionData=%5B%7B%22name%22%3A%22planhub%22%7D%5D'. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: webSockets transport starting. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Connecting to websocket endpoint 'ws://localhost:8080/signalr/connect?transport=webSockets&clientProtocol=1.5&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAA5D8YUVyzBEG4tTlTaGn0MgAAAAACAAAAAAADZgAAwAAAABAAAABDjF1MaCTzZI0XTM8gC29xAAAAAASAAACgAAAAEAAAAKrk0jv%2FKF4YFzDvNwmSR8IoAAAAacm1d1r7dJpjOtVtCFIFRpugkubyZm1e5Z8OtOFtnhZyEBO1SO4lqhQAAABiG7hBydTiypPh8k2ZYz20ropNxw%3D%3D&connectionData=%5B%7B%22name%22%3A%22planhub%22%7D%5D&tid=6'. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Websocket opened. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: webSockets transport connected. Initiating start request. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: The start request succeeded. Transitioning to the connected state. 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Now monitoring keep alive with a warning timeout of 13333.333333333332, keep alive timeout of 20000 and disconnecting timeout of 30000 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Invoking planhub.Register 
jquery.signalR-2.2.0.min.js?v=8588299:8 [06:23:19 GMT-0700 (Pacific Daylight Time)] SignalR: Invoked planhub.Register 

यह सफलतापूर्वक पंजीकृत करता है, लेकिन किसी भी डेटा कभी नहीं मिलती। Clients.All.updateStatus(planId, message); ब्रेकपॉइंट कई बार मारा गया था लेकिन कंसोल को कोई अतिरिक्त लॉगिंग डेटा कभी नहीं मिला।

संपादित करें: यह सुझाव दिया गया था कि मैं कस्टम निर्भरता रिज़ॉल्वर खेलने में हूं या नहीं। यहां पोस्ट किया गया कोड आपके स्वयं के प्रोजेक्ट में बहुत कम है, जो आप यहां देखते हैं उसके अलावा। कोड जो PlanPublisher.UpdateStatus() पर कॉल करता है, उसके पास कस्टम निर्भरता रिज़ॉल्वर होता है, लेकिन इससे कोई फर्क नहीं पड़ता क्योंकि यह अपनी असेंबली में अलग है। PlanPublisher.cs और PlanHub.cs एक बहुत ही सरल परियोजना में निहित हैं जिसमें केवल SignalR.Core और SignalR.SelfHost के संदर्भ हैं।

+1

आप कम से कम उदाहरण जो आपकी समस्या reproduces प्रदान करने के लिए की जरूरत है। मैंने बस सर्वर और क्लाइंट साइड दोनों पर दिए गए सटीक कोड के साथ चलाने की कोशिश की, और यह बिना किसी समस्या के ठीक हो गया। – Evk

+0

@ स्कॉट, क्या आपने इसे किसी भी तरह हल करने का प्रबंधन किया था? क्योंकि मुझे एक ही समस्या का सामना करना पड़ रहा है। मजाकिया हिस्सा- अगर मैं समूह के लिए प्रकाशित करने का प्रयास करता हूं, तो यह काम करता है, लेकिन सभी के लिए नहीं। दूसरी तरफ, जब मैं इस कार्यक्षमता को आजमाने के लिए एक अलग प्रोजेक्ट बनाता हूं, तो सबकुछ ठीक काम करता है। – Max

उत्तर

2

इस प्रयास करें:

public void UpdateStatus(int planId, string message) 
{ 
    var clients = GlobalHost.ConnectionManager.GetHubContext<PlanHub>().Clients; 
    clients.All.updateStatus(planId, message); 
} 

मुझे लगता है कि समस्या यह है कि PlanPublisher हब संदर्भ (और ग्राहकों) बनाया जाता है से पहले आरंभ नहीं हो जाता है।

+0

सुझाव के लिए धन्यवाद। बस कोशिश की, वही व्यवहार हालांकि। – Scott

+0

क्या आप .js कंसोल डीबगिंग पोस्ट कर सकते हैं? '$ .connection.hub.logging = सत्य;' –

2

मैंने आपके उदाहरण को सरल बनाने की कोशिश की (सिग्नल 2.2 का उपयोग करके।0)

हब वर्ग:

public class PlanHub : Hub 
{ 
    private const string GroupPrefix = "PlanGroup_"; 

    // hubcontext 
    private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext <PlanHub>(); 

    public void Register(int companyId) 
    { 
     Groups.Add(Context.ConnectionId, $"{GroupPrefix}{companyId}"); 
    } 

    public void Unregister(int companyId) 
    { 
     Groups.Remove(Context.ConnectionId, $"{GroupPrefix}{companyId}"); 
    } 

    // static method using hub context 
    public static void Static_UpdateStatus(int planId, string message) 
    { 
     hubContext.Clients.All.updateStatus(planId, message); 
    } 
} 

के बाद से मैं वास्तव में एक बैकएंड नहीं है और मैं नहीं जानता कि कैसे आपको लगता है कि, मैंने अभी एक टाइमर से विधि कॉल करने के लिए सेट करने जा रहे हैं सी # हर 10 सेकंड।

कॉलिंग और डमी टाइमर:

public void startTimer() 
    { 
     timer = new System.Timers.Timer(); 
     timer.Elapsed += new System.Timers.ElapsedEventHandler(ExecuteTimerJob); 
     timer.Interval = 10000; // 10 sec 
     timer.Start(); 
    } 

    public static void ExecuteTimerJob(object source, System.Timers.ElapsedEventArgs e) 
    { 
     // this is the call from C# 
     PlanHub.Static_UpdateStatus(123, "some message"); 
    } 

जे एस:

$(function() { 
    var planHub = $.connection.planHub; 
    $.connection.hub.start().done(function() { 
     console.debug('Connected to PlanHub...'); 
    }) 
    planHub.client.updateStatus = function (planId, message) { 
     console.log("planId: " + planId); 
     console.log("message: " + message); 
    } 
}); 

ब्राउज़र कंसोल में परिणाम:

enter image description here

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