Сообщения, не поступающие в службу Azure SignalR
Я внедряю службу 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?
1 ответ
Это может быть вызвано ошибочным методом, неправильной подписью метода, неправильным именем концентратора, дублированным именем метода на клиенте или отсутствующим анализатором JSON на клиенте, поскольку он может молча завершиться сбоем на сервере.
Взято из вызова методов между клиентом и сервером молча происходит сбой:
Метод с ошибкой, неверная подпись метода или неправильное имя концентратора
Если имя или подпись вызываемого метода не точно совпадает с подходящим методом на клиенте, вызов завершится неудачно. Убедитесь, что имя метода, вызываемое сервером, совпадает с именем метода на клиенте. Кроме того, SignalR создает прокси-сервер-концентратор, используя методы в верблюжьей оболочке, как уместно в JavaScript, поэтому метод называется
SendMessage
на сервере будет называтьсяsendMessage
в клиентском прокси. Если вы используетеHubName
атрибут в коде на стороне сервера, убедитесь, что используемое имя соответствует имени, используемому для создания концентратора на клиенте. Если вы не используетеHubName
атрибут, убедитесь, что имя хаба в клиенте JavaScript имеет верблюжий корпус, такой как chatHub вместо ChatHub.Дубликат имени метода на клиенте
Убедитесь, что у вас нет дублирующего метода на клиенте, который отличается только регистром. Если в вашем клиентском приложении есть метод
sendMessage
, убедитесь, что нет также метода с именемSendMessage
также.Отсутствует парсер JSON на клиенте
SignalR требует наличия синтаксического анализатора JSON для сериализации вызовов между сервером и клиентом. Если у вашего клиента нет встроенного анализатора JSON (например, Internet Explorer 7), вам необходимо включить его в свое приложение.
Обновить
В ответ на ваши комментарии я бы посоветовал вам попробовать один из примеров Azure SignalR, например " Начало работы с SignalR: пример чата", чтобы проверить, действуете ли вы так же.
Надеюсь, поможет!