Mam klasę NotificationHub, która dziedziczy z klasy Hub.Hub.Clients.User (userId) .methodCall zawsze rzuca Odwołanie do obiektu nie jest ustawione na instancję obiektu
public class NotificationHub : Hub
{
public void Send(string userId, Notification notification)
{
Clients.User(userId)
.notificationReceived(notification);
}
}
To zawsze kończy się niepowodzeniem z
[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
Jednak jeśli mogę to zrobić:
public class NotificationHub : Hub
{
public void Send(string userId, Notification notification)
{
var context = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
context.Clients.User(userId)
.notificationReceived(notification);
}
}
To działa .... co daje tutaj? Większość przykładów, które widziałem, nie wymaga jawnego kontekstu, jeśli nie jest już dostępna w Hubie? Wolałbym raczej nie chwytać tego wyraźnie za każdym razem.
Oto moja konfiguracja IoC:
GlobalHost.DependencyResolver.Register(typeof(IHubActivator),() => new SimpleInjectorHubActivator(container));
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => new SignalRHubUserIdProvider());
Activator:
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);
}
}
Wyjątek "NullReferenceException", który otrzymujesz, jest to podczas wywoływania metody 'Send()' z klienta lub z innego kodu serwera? –
Jest to podczas wywoływania wysyłania z serwera, Clients.User (userId) .notificationReceived (powiadomienie); zgłasza wyjątek – Jack