我正在学习.Net Core SignalR,并研究如何在我的应用实时图表中使用它。我在网上玩了一些示例,它们都可以工作,但是我不知道如何在数据库轮询中使用SignalR。我遇到以下错误:
无法访问已处置的对象...
我假设它与我的contex有关,在请求完成后将其丢弃。我正在使用依赖注入。
ChatController
public class ChatController : ControllerBase
{
private IChatService _chatService;
private IChatContext<ChatHub> _hub;
public ChatController(IChatContext<ChatHub> hub, IChatService chatService)
{
_hub = hub;
_chatService = chatService;
}
public IActionResult Get()
{
var timerManager = new TimerManager(() => _hub.Clients.All.SendAsync("transferchatdata", _chatService.ChatDataByProds()));
return Ok(new { Message = "Request Completed" });
}
}
ChatService
public interface IChatService
{
IEnumerable<ChatDataByProd> ChatDataByProds();
}
public class ChatService : IChatService
{
private ChatContext _context;
public ChatService(ChatContext context)
{
_context = context;
}
public IEnumerable<ChatDataByProd> ChatDataByProds()
{
return _context.ChatDataByProds;
}
}
ChatHub
public class ChatHub : Hub
{
}
答案 0 :(得分:0)
似乎您正在使用EF Core上下文,该上下文是范围内的生存期服务,这意味着ASP.NET Core中的每个请求生存期。您的ChatService
的生存期必须比HTTP请求更长,并且在您仍保留对容器的引用的同时,容器将处置数据库上下文的单个实例。
因此,每次需要访问数据库时,都需要在IServiceProvider
的ctor中获取一个ChatService
容器,并在数据库的上下文中分别GetService
。