触发事件时,SignalR集线器客户端为空 [英] SignalR Hubs Clients are null when firing event
问题描述
我编写了一个通用集线器,遇到了一些问题,因此为了调试它,我决定进行如下简单的连接计数:
I've written a generic hubs which I'm having some issues with so to debug it I've decided to make a simple connection count like so:
public class CRUDServiceHubBase<TDTO> : Hub, ICRUDServiceHubBase<TDTO>
{
public const string CreateEventName = "EntityCreated";
public const string UpdateEventName = "EntityUpdated";
public const string DeleteEventName = "EntityDeleted";
protected int _connectionCount = 0;
public Task Create(TDTO entityDTO)
{
return Clients.All.InvokeAsync(CreateEventName, entityDTO);
}
public Task Update(TDTO entityDTO)
{
return Clients.All.InvokeAsync(UpdateEventName, entityDTO);
}
public Task Delete(object[] id)
{
return Clients.All.InvokeAsync(DeleteEventName, id);
}
public override Task OnConnectedAsync()
{
this._connectionCount++;
return base.OnConnectedAsync();
}
public override Task OnDisconnectedAsync(Exception exception)
{
this._connectionCount--;
return base.OnDisconnectedAsync(exception);
}
}
public class MessagesHub : CRUDServiceHubBase<MessageDTO>
{
public MessagesHub() : base()
{
}
}
我正在像这样注册此类:
I'm registering this class like so:
services.AddTransient<ICRUDServiceHubBase<MessageDTO>, MessagesHub>();
我有一个正在使用它的服务,我正在使用它的实现工厂来订阅它的事件:
I have a service who is using this, which I'm using it's implementation factory to subscribing to it's events:
services.AddTransient<IMessageDTOService>( (c) => {
var context = c.GetRequiredService<DbContext>();
var adapter = c.GetRequiredService<IAdaptable<Message, IMessageDTO, MessageDTO>>();
var validator = c.GetRequiredService<IValidator<Message>>();
var entityMetadataService = c.GetRequiredService<IEntityMetadataService<Message>>();
var service = new MessageDTOService(context, adapter, validator, entityMetadataService);
var hub = c.GetService<ICRUDServiceHubBase<MessageDTO>>();
this.RegisterHubsCreate(service, hub);
return service;
});
当我去触发事件时,我得到一个空引用:
When I go to fire the event I get a null reference:
Microsoft.AspNetCore.SignalR.Hub.Clients.get返回null.
Microsoft.AspNetCore.SignalR.Hub.Clients.get returned null.
我最好的猜测是,由于该服务是控制器的依赖项,它是在signalR初始化客户端之前创建的吗?
My best guess is that because the service is a dependency for the controller, It's created before signalR can initialize It's clients?
有人建议我如何注册活动并填充客户吗?
Does anyone have a suggestion on how I can register my events, and have a client populated?
推荐答案
当我想调用服务器端时,我需要将IHubContext注入到集线器中才能访问客户端.
I turns out I needed to Inject the IHubContext into my hubs to have access to the clients when I want to invoke server side.
protected IHubContext<CRUDServiceHubBase<TDTO>> _context;
public CRUDServiceHubBase(IHubContext<CRUDServiceHubBase<TDTO>> context)
{
this._context = context;
}
public Task Create(TDTO entityDTO)
{
return this._context.Clients.All.InvokeAsync(CreateEventName, entityDTO);
}
这篇关于触发事件时,SignalR集线器客户端为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!