Я реализую службу 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?