मैं वर्तमान में सर्वर द्वारा उत्पन्न सर्वर और कई अलग-अलग प्रक्रियाओं के बीच संवाद करने के लिए सिग्नलआर का उपयोग कर रहा हूं। दोनों सर्वर & क्लाइंट को सी # में कोडित किया गया है। मैं सिग्नलर 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
के लिए अभी भी कोई स्पष्टीकरण नहीं छोड़ा गया है क्योंकि मैं अपने सभी कॉलबैक में अभी तक कुछ नहीं करता हूं (अभी तक)।
आपकी धीमी कॉलबैक के संबंध में, शायद आपको धीमी प्रक्रिया [पृष्ठभूमि में] (http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx) निष्पादित करने की आवश्यकता है, और केवल कार्य को बंद करने के लिए सिग्नलआर का उपयोग करें ? वैसे भी, यह एक अलग मुद्दा है। अपने आईओसी समाधान को अपने प्रश्न से बाहर ले जाएं और जवाब दें। फिर यदि आवश्यक हो, तो अपनी धीमी कॉलबैक के लिए एक नया प्रश्न बनाएं। – mason
@ मेसन: मेरे पास किसी भी कॉलबैक (क्लाइंट और सर्वर पक्ष) के भीतर कोई लंबी चल रही प्रक्रिया नहीं है। यही कारण है कि मैं इस त्रुटि को लेकर हैरान हूं। मैं प्रश्न को एक ही विषय में रखने में आपकी बात समझता हूं, लेकिन मुद्दा संबंधित लगता है। – KOTIX