Я внедряю службу Azure SignalR в моем приложении ASP.NET Core 2.2 с React-интерфейсом.Когда я отправляю сообщение, я НЕ получаю никаких ошибок, но мои сообщения не достигают службы Azure SignalR.
Если говорить точнее, это приложение для приватного чата, поэтому, когда сообщение достигает концентратора, я тольконеобходимо отправить его участникам этого конкретного чата, а НЕ всем соединениям.
Когда я отправляю сообщение, оно попадает в мой концентратор, но я не вижу признаков того, что сообщение отправляется в службу Azure.
В целях безопасности я использую аутентификацию Auth0 JWT Token
.В моем хабе я правильно вижу утверждения авторизованного пользователя, поэтому не думаю, что есть проблемы с безопасностью.Как я уже упоминал, тот факт, что я могу подключиться к концентратору, говорит о том, что интерфейс и безопасность работают нормально.
Однако на портале Azure я не вижу никаких признаков каких-либо сообщений, но если ячитая данные правильно, я вижу 2 клиентских соединения, которые являются правильными в моих тестах, т.е. два открытых браузера, которые я использую для тестирования.Вот снимок экрана:
Вот мой Startup.cs
код:
public void ConfigureServices(IServiceCollection services)
{
// Omitted for brevity
services.AddAuthentication(options => {
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(jwtOptions => {
jwtOptions.Authority = authority;
jwtOptions.Audience = audience;
jwtOptions.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
var accessToken = context.Request.Query["access_token"];
// Check to see if the message is coming into chat
var path = context.HttpContext.Request.Path;
if (!string.IsNullOrEmpty(accessToken) &&
(path.StartsWithSegments("/im")))
{
context.Token = accessToken;
}
return System.Threading.Tasks.Task.CompletedTask;
}
};
});
// Add SignalR
services.AddSignalR(hubOptions => {
hubOptions.KeepAliveInterval = TimeSpan.FromSeconds(10);
}).AddAzureSignalR(Configuration["AzureSignalR:ConnectionString"]);
}
А вот метод Configure()
:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// Omitted for brevity
app.UseSignalRQueryStringAuth();
app.UseAzureSignalR(routes =>
{
routes.MapHub<Hubs.IngridMessaging>("/im");
});
}
Вот метод, который я использую для сопоставления connectionId
пользователя с userName
:
public override async Task OnConnectedAsync()
{
// Get connectionId
var connectionId = Context.ConnectionId;
// Get current userId
var userId = Utils.GetUserId(Context.User);
// Add connection
var connections = await _myServices.AddHubConnection(userId, connectionId);
await Groups.AddToGroupAsync(connectionId, "Online Users");
await base.OnConnectedAsync();
}
Вот один из моих методов-концентраторов.Обратите внимание, что я знаю, что пользователь может иметь несколько подключений одновременно.Я просто упростил код, чтобы его было легче переварить.Фактический код моей учетной записи для пользователей, имеющих несколько подключений:
[Authorize]
public async Task CreateConversation(Conversation conversation)
{
// Get sender
var user = Context.User;
var connectionId = Context.ConnectionId;
// Send message to all participants of this chat
foreach(var person in conversation.Participants)
{
var userConnectionId = Utils.GetUserConnectionId(user.Id);
await Clients.User(userConnectionId.ToString()).SendAsync("new_conversation", conversation.Message);
}
}
Есть идеи, что я делаю не так, что сообщения не попадают в службу Azure SignalR?