我无法从实施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;
}
}
属性UserId
和TenantId
仍然是null
。
Chat
类位于“应用程序”层中,AbpSession
运行良好。
这适用于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。
你可能没有像在encryptedAuthToken
那样传递SignalRAspNetCoreHelper.ts:
var encryptedAuthToken = new UtilsService().getCookieValue(AppConsts.authorization.encrptedAuthTokenName);
var qs = AppConsts.authorization.encrptedAuthTokenName + "=" + encodeURIComponent(encryptedAuthToken);
然后将其作为SignalR中心的URL中的查询字符串传递。
我认为问题可能与您正在使用的属性注入有关:
public IAbpSession AbpSession { get; set; }
虽然SignalR使用DI,但它不会从DI容器创建Chat类。这意味着财产注入不起作用。但构造函数注入可以工作,因为它从DI容器传递ctor参数。
因此,使用构造函数注入而不是属性注入。