2015-09-09 9 views
6

मैं वर्तमान में सर्वर द्वारा उत्पन्न सर्वर और कई अलग-अलग प्रक्रियाओं के बीच संवाद करने के लिए सिग्नलआर का उपयोग कर रहा हूं। दोनों सर्वर & क्लाइंट को सी # में कोडित किया गया है। मैं सिग्नलर 2.2.0.0 का उपयोग कर रहा हूं सर्वर की तरफ, मैं सर्वर चलाने के लिए ओविन का उपयोग करता हूं। मैं लाइट इंजेक्शन का उपयोग आईओसी कंटेनर के रूप में भी कर रहा हूं।सिग्नलआर सर्वर -> क्लाइंट कॉल काम नहीं कर रहा है

यहाँ मेरी कोड है:

public async Task Connect() 
{ 
    try 
    { 
     m_hubConnection = new HubConnection(m_serverUrl, false); 
     m_hubConnection.Closed += OnConnectionClosed; 
     m_hubConnection.TraceLevel = TraceLevels.All; 
     m_hubConnection.TraceWriter = Console.Out; 

     var serializer = m_hubConnection.JsonSerializer; 
     serializer.TypeNameHandling = TypeNameHandling.Auto; 
     serializer.PreserveReferencesHandling = PreserveReferencesHandling.Objects; 

     m_managementHubProxy = m_hubConnection.CreateHubProxy(AgentConstants.ManagementHub.Name); 
     m_managementHubProxy.On("closeRequested", CloseRequestedCallback); 

     await m_hubConnection.Start(); 
    } 
    catch (Exception e) 
    { 
     m_logger.Error("Exception encountered in Connect method", e); 
    } 
} 

सर्वर साइड पर मैं एक करीबी अनुरोध के बाद जिस तरह से भेजें::

var managementHub = GlobalHost.ConnectionManager.GetHubContext<ManagementHub>(); 
managementHub.Clients.All.closeRequested(); 

public class AgentManagementStartup 
{ 
    public void ConfigurationOwin(IAppBuilder app, IAgentManagerDataStore dataStore) 
    { 
     var serializer = new JsonSerializer 
     { 
      PreserveReferencesHandling = PreserveReferencesHandling.Objects, 
      TypeNameHandling = TypeNameHandling.Auto, 
      TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
     }; 

     var container = new ServiceContainer(); 
     container.RegisterInstance(dataStore); 
     container.RegisterInstance(serializer); 
     container.Register<EventHub>(); 
     container.Register<ManagementHub>(); 
     var config = container.EnableSignalR(); 

     app.MapSignalR("", config); 
    } 
} 

ग्राहक पक्ष पर, मैं इस तरह से रजिस्टर

मुझे कभी भी CloseRequestedCallback में कोई कॉलबैक नहीं मिलता है। न तो ग्राहक पक्ष पर और न ही सर्वर पक्ष पर मुझे लॉग में कोई त्रुटि मिलती है।

मैंने यहां क्या गलत किया?

संपादित 09/10/15

कुछ अनुसंधान और संशोधनों के बाद, मुझे पता चला यह आईओसी कंटेनर के प्रतिस्थापन के साथ जोड़ा गया था। जब मैंने लाइट इंजेक्शन से जुड़ी सबकुछ हटा दी और सिग्नलआर का इस्तेमाल किया, तो सबकुछ काम करता था। सिग्नलआर के साथ लाइट इंजेक्ट documented their integration के बाद से मैं इस बारे में हैरान था।

मुझे यह मिलने के बाद, मुझे एहसास हुआ कि GlobalHost.DependencyResolver वह नहीं था जैसा मैं HubConfiguration पर आपूर्ति कर रहा था। एक बार मैं पहले

app.MapSignalR("", config); 

GlobalHost.DependencyResolver = config.Resolver; 

जोड़ा मैं अब CloseRequestedCallback भीतर कॉलबैक प्राप्त कर रहा। दुर्भाग्य से, मैं निम्न त्रुटि के रूप में जल्द मैं सर्वर से ग्राहक से विधि कॉल के रूप में मिलती है:

Microsoft.AspNet.SignalR.Client.Infrastructure.SlowCallbackException

संभव गतिरोध का पता चला। "HubProxy.On" या "कनेक्शन। प्राप्त" के साथ पंजीकृत एक कॉलबैक कम से कम 10 सेकंड के लिए निष्पादित किया जा रहा है।

मुझे यकीन है कि मुझे मिले फिक्स के बारे में निश्चित नहीं है और सिस्टम पर इसका क्या असर हो सकता है। क्या GlobalHost.DependencyResolver को अपनी सभी डिफ़ॉल्ट सामग्री पंजीकृत किए बिना अपने आप के साथ बदलना ठीक है?

संपादित 2 09/10/15

this के अनुसार, GlobalHost.DependencyResolver बदलते ऐसा करना सही है। SlowCallbackException के लिए अभी भी कोई स्पष्टीकरण नहीं छोड़ा गया है क्योंकि मैं अपने सभी कॉलबैक में अभी तक कुछ नहीं करता हूं (अभी तक)।

+0

आपकी धीमी कॉलबैक के संबंध में, शायद आपको धीमी प्रक्रिया [पृष्ठभूमि में] (http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx) निष्पादित करने की आवश्यकता है, और केवल कार्य को बंद करने के लिए सिग्नलआर का उपयोग करें ? वैसे भी, यह एक अलग मुद्दा है। अपने आईओसी समाधान को अपने प्रश्न से बाहर ले जाएं और जवाब दें। फिर यदि आवश्यक हो, तो अपनी धीमी कॉलबैक के लिए एक नया प्रश्न बनाएं। – mason

+0

@ मेसन: मेरे पास किसी भी कॉलबैक (क्लाइंट और सर्वर पक्ष) के भीतर कोई लंबी चल रही प्रक्रिया नहीं है। यही कारण है कि मैं इस त्रुटि को लेकर हैरान हूं। मैं प्रश्न को एक ही विषय में रखने में आपकी बात समझता हूं, लेकिन मुद्दा संबंधित लगता है। – KOTIX

उत्तर

3

अंक 1: आईओसी कंटेनर + निर्भरता इंजेक्शन

क्या आप HubConfiguration के लिए आईओसी को बदलना चाहते हैं, तो आप भी GlobalHost ताकि एक ही हब लौटाता है जब यह के ouside का अनुरोध से एक को बदलने की जरूरत संदर्भ।

समस्या 2: अप्रत्याशित SlowCallbackException

यह अपवाद तथ्य यह है कि मैं एक कंसोल आवेदन के भीतर SignalR उपयोग कर रहा था की वजह से किया गया था। अनुप्रयोग के प्रवेश बिंदु नहीं हो सकता एक async विधि तो मेरे प्रारंभिक विन्यास एसिंक्रोनस रूप से कॉल करने के लिए मैं पालन किया था सक्षम होने के लिए:

private static int Main() 
{ 
    var t = InitAsync(); 
    t.Wait(); 
    return t.Result; 
} 

मेरे लिए दुर्भाग्य से, यह जैसे मुद्दों का एक बहुत का कारण बनता है विवरण में here & अधिक वर्णित here

शुरू करने से मेरी InitAsync पालन:

private static int Main() 
{ 
    Task.Factory.StartNew(async()=> await InitAsync()); 
    m_waitInitCompletedRequest.WaitOne(TimeSpan.FromSeconds(30)); 
    return (int)EndpointErrorCode.Ended; 
} 

सब कुछ अब ठीक चलाता है और मैं किसी भी गतिरोध नहीं मिलता है।

& उत्तरों के बारे में अधिक जानकारी के लिए, आप मेरे प्रश्न में संपादन का भी उल्लेख कर सकते हैं।

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