Мы пытаемся интегрировать SignalR в стороннее приложение, чтобы общаться с нашими концентраторами для нашего приложения aspnetboilerplate. Это использует шаблон .NET Core. У нас возникла проблема с сеансом в aspnetboilerplate, имеющим null
UserId
даже при прохождении атрибута на нашем концентраторе для проверки авторизации.
Проблема, с которой мы сталкиваемся, заключается в том, что случайным образом UserId
внутри AbpSession
будет просто нулевым. Он проходит мимо атрибута [Authorize]
, но aspnetboilerplate, похоже, думает, что UserId имеет значение null в случайное время. Я могу вызвать метод в нашем хабе и увидеть, что UserId подходит для этого пользователя. Затем в следующий раз, когда я вызываю тот же метод на хабе с тем же пользователем, UserId внутри AbpSession
равен null.
, я могу снова вызвать метод, и UserId
иногда будет null
или иногда будет правильным. Кажется, что в этом вопросе нет никакой последовательности. Время от времени он будет чередоваться между null
и правильным UserId
.
Наш клиентский код:
let connection = new signalR.HubConnectionBuilder()
.withUrl('ENTER HUB URL HERE',
{
transport: signalR.HttpTransportType.LongPolling,
accessTokenFactory: () => {
return 'BEARER TOKEN HERE'
}}).build()
connection.invoke('sendGroupMessage', text, hardCodedChatGroup)
Вот образец нашего концентратора SignalR на сервере:
[AbpMvcAuthorize]
public class OpenChatHub : Hub, ITransientDependency
{
public IAbpSession AbpSession { get; set; }
public ILogger Logger { get; set; }
public OpenChatHub()
{
AbpSession = NullAbpSession.Instance;
Logger = NullLogger.Instance;
}
public async Task SendGroupMessage(string message, string groupName)
{
// logic for the SendGroupMessage would be here
var msg = new
{
sendById = AbpSession.UserId, // this will be null at random times
message = message
};
await Clients.Group(group).SendAsync("receiveChatMessage", msg);
}
}
Я могу просматривать запросы на согласование SignalR и взаимодействие с концентратором, и я вижу, что токен каждый раз передается правильно.