从SignalR中心内的自定义类访问Identity UserManager

时间:2017-05-25 20:31:04

标签: c# asp.net signalr

我正在尝试从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对象,但无法识别正确的进程。我尝试过这里给出的指导,从集线器外部访问集线器:

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-server#how-to-call-client-methods-and-manage-groups-from-outside-the-hub-class

 IHubContext ChatHubContext = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();

但是,这不是正确的“上下文”,因为这会为IHubContext对象提供GroupsClients的属性。

是否可以访问公开Request.GetHttpContext...方法的正确上下文对象?

0 个答案:

没有答案