我正在尝试从SignalR中心初始化ChatUser
类。此类的一个属性是自定义标识ApplicationUser
对象。当我实例化ChatUser
的实例时,我还会填充此ApplicationUser
属性,以便我可以在我的应用中访问有关用户的信息,如下所示:
public ChatUser(int userId)
{
ApplicationUser u = UserManager.FindById(userId);
this.User = u;
}
但是,我无法让UserManager
对象在此类中正确实例化。
在SignalR之外(例如,在普通控制器中),我通常会使用以下代码实例化UserManager
:
private ApplicationUserManager _userManager;
private ApplicationUserManager UserManager
{
get
{
if (_userManager == null)
{
_userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
if ((_userManager == null) || (_userManager.IsDisposed == true))
{
_userManager = new ApplicationUserManager(new CustomUserStore(new ApplicationDbContext()));
}
return _userManager;
}
set
{
_userManager = value;
}
}
但是,根据SignalR文档,HttpContext
对象不可靠(在本例中我已确认为真),您应该使用以下内容:
_userManager = Context.Request.GetHttpContext().GetOwinContext().GetUserManager<ApplicationUserManager>();
这在集线器内部可以正常工作。我试图找到如何在我的自定义类中使用此Context
对象,但无法识别正确的进程。我尝试过这里给出的指导,从集线器外部访问集线器:
IHubContext ChatHubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
但是,这不是正确的“上下文”,因为这会为IHubContext
对象提供Groups
和Clients
的属性。
是否可以访问公开Request.GetHttpContext...
方法的正确上下文对象?