从SignalR Hub中的AbpSession获取UserId

问题描述 投票:0回答:2

我无法从实施UserId的类中获取AbpSession中的ITransientDependency

public class Chat : Hub, ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public ILogger Logger { get; set; }

    public Chat()
    {
        AbpSession = NullAbpSession.Instance;
        Logger = NullLogger.Instance;
    }

    private static List<MemberDto> _members = new List<MemberDto>();

    public Task Send(string message)
    {
        return Clients.All.InvokeAsync("Send", string.Format("User {0}: {1}", UserId(), message));
    }

    public long? UserId()
    {
        return AbpSession.UserId;
    }
}

属性UserIdTenantId仍然是null

Chat类位于“应用程序”层中,AbpSession运行良好。

c# authentication asp.net-core signalr aspnetboilerplate
2个回答
1
投票

这适用于SignalR AspNetCore Integration。我试过here

public async Task SendMessage(string message)
{
    await Clients.All.InvokeAsync("getMessage", string.Format("User {0}: {1}", AbpSession.UserId, message));
}

你现在可以用download预览模板的v3.4.1 Abp.AspNetCore.SignalR

Update

你可能没有像在encryptedAuthToken那样传递SignalRAspNetCoreHelper.ts

var encryptedAuthToken = new UtilsService().getCookieValue(AppConsts.authorization.encrptedAuthTokenName);
var qs = AppConsts.authorization.encrptedAuthTokenName + "=" + encodeURIComponent(encryptedAuthToken);

然后将其作为SignalR中心的URL中的查询字符串传递。


1
投票

我认为问题可能与您正在使用的属性注入有关:

public IAbpSession AbpSession { get; set; }

虽然SignalR使用DI,但它不会从DI容器创建Chat类。这意味着财产注入不起作用。但构造函数注入可以工作,因为它从DI容器传递ctor参数。

因此,使用构造函数注入而不是属性注入。

© www.soinside.com 2019 - 2024. All rights reserved.