2015-06-18 3 views
6

मेरे पास एक अधिसूचना हब क्लास है जो हब क्लास से प्राप्त होती है।Hub.Clients.User (userId) .methodCall हमेशा ऑब्जेक्ट संदर्भ को किसी ऑब्जेक्ट के उदाहरण पर सेट नहीं करता है

public class NotificationHub : Hub 
    { 
     public void Send(string userId, Notification notification) 
     { 
      Clients.User(userId) 
       .notificationReceived(notification); 
     } 
    } 

यह हमेशा

[NullReferenceException: Object reference not set to an instance of an object.] 
    Microsoft.AspNet.SignalR.Hubs.SignalProxy.Invoke(String method, Object[] args) +88 
    Microsoft.AspNet.SignalR.Hubs.SignalProxy.TryInvokeMember(InvokeMemberBinder binder, Object[] args, Object& result) +12 
    CallSite.Target(Closure , CallSite , Object , <>f__AnonymousType0`4) +351 

के साथ विफल मैं यह कर लेकिन अगर:

public class NotificationHub : Hub 
    { 
     public void Send(string userId, Notification notification) 
     { 
      var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>(); 

      context.Clients.User(userId) 
       .notificationReceived(notification); 
     } 
    } 

यह काम करता है .... यहाँ क्या देता है? मैंने जो उदाहरणों को देखा है, उन्हें स्पष्ट रूप से संदर्भ प्राप्त करने की आवश्यकता नहीं है, क्या यह पहले से ही हब से उपलब्ध नहीं होना चाहिए? मुझे इसे हर बार स्पष्ट रूप से पकड़ना नहीं होगा।

यहाँ मेरी आईओसी सेटअप है:

GlobalHost.DependencyResolver.Register(typeof(IHubActivator),() => new SimpleInjectorHubActivator(container)); 
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new SignalRHubUserIdProvider()); 

उत्प्रेरक:

public class SimpleInjectorHubActivator : IHubActivator 
    { 
     private readonly Container _container; 

     public SimpleInjectorHubActivator(Container container) 
     { 
      _container = container; 
     } 

     public IHub Create(HubDescriptor descriptor) 
     { 
      return (IHub) _container.GetInstance(descriptor.HubType); 
     } 
    } 
+0

आपको 'NullReferenceException' मिल रहा है, क्या यह क्लाइंट से या अलग सर्वर कोड से' भेजें() 'विधि को कॉल करते समय है? –

+0

यह तब होता है जब सर्वर से कॉल करना, क्लाइंट्स.उसर (उपयोगकर्ता आईडी) । नोटिफिकेशन प्राप्त (अधिसूचना); अपवाद फेंकता है – Jack

उत्तर

8

आप हब हैंडलर विधियों में से बाहर से ग्राहकों के लिए कुछ भेजना चाहते हैं (यानी सर्वर पर संदेश हैंडलिंग के दौरान नहीं), आपको GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();

कारण यह है कि जब किसी क्लाइंट साइड संदेश को संभालने के लिए विधि कहा जाता है, तो हब इंस्टेंस सिग्नलआर द्वारा बनाया जाता है और Clients संपत्ति सही ढंग से शुरू की गई है। ऐसा कोई मामला नहीं है जब आप सर्वर कोड से स्वयं को कॉल कर रहे हैं (और शायद हब इंस्टेंस स्वयं बनाते हैं)।

इमो त्रुटि संदेश बहुत स्पष्ट नहीं है और इस उपयोग मामले को सिग्नल द्वारा बेहतर तरीके से संभाला जाना चाहिए। वैसे भी इसी कारण से मैं उन ग्राहकों को संदेश भेजने के सभी तरीकों को अलग करने का सुझाव देता हूं जिन्हें सर्वर कोड से अलग वर्ग में बुलाया जाना है (Hub से प्राप्त नहीं)।

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

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