Сообщения, не поступающие в службу Azure SignalR - PullRequest
0 голосов
/ 05 декабря 2018

Я внедряю службу Azure SignalR в моем приложении ASP.NET Core 2.2 с React-интерфейсом.Когда я отправляю сообщение, я НЕ получаю никаких ошибок, но мои сообщения не достигают службы Azure SignalR.

Если говорить точнее, это приложение для приватного чата, поэтому, когда сообщение достигает концентратора, я тольконеобходимо отправить его участникам этого конкретного чата, а НЕ всем соединениям.

Когда я отправляю сообщение, оно попадает в мой концентратор, но я не вижу признаков того, что сообщение отправляется в службу Azure.

В целях безопасности я использую аутентификацию Auth0 JWT Token.В моем хабе я правильно вижу утверждения авторизованного пользователя, поэтому не думаю, что есть проблемы с безопасностью.Как я уже упоминал, тот факт, что я могу подключиться к концентратору, говорит о том, что интерфейс и безопасность работают нормально.

Однако на портале Azure я не вижу никаких признаков каких-либо сообщений, но если ячитая данные правильно, я вижу 2 клиентских соединения, которые являются правильными в моих тестах, т.е. два открытых браузера, которые я использую для тестирования.Вот снимок экрана:

enter image description here

Вот мой 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 Ответ

0 голосов
/ 05 декабря 2018

Это может быть вызвано ошибочным методом, неправильной подписью метода, неверным именем концентратора, дублированным именем метода на клиенте или отсутствующим анализатором JSON на клиенте, поскольку он может молча завершаться с ошибкой на сервере.

Принятс Вызов методов между клиентом и сервером молча завершается ошибкой :

Неправильный метод, неверная подпись метода или неверное имя концентратора

Еслиимя или подпись вызываемого метода не совсем соответствует подходящему методу на клиенте, вызов не удастся.Убедитесь, что имя метода, вызываемое сервером, совпадает с именем метода на клиенте.Кроме того, SignalR создает прокси-сервер-концентратор, используя методы в верблюжьей оболочке, как это целесообразно в JavaScript, поэтому метод с именем SendMessage на сервере будет называться sendMessage в клиентском прокси.Если вы используете атрибут HubName в своем коде на стороне сервера, убедитесь, что используемое имя соответствует имени, используемому для создания концентратора на клиенте.Если вы не используете атрибут HubName, убедитесь, что имя концентратора в клиенте JavaScript занято верблюдом, например chatHub вместо ChatHub.

Дублирующееся имя метода на клиенте

Убедитесь, что у вас нет дублирующего метода на клиенте, который отличается только регистром.Если в вашем клиентском приложении есть метод с именем sendMessage, убедитесь, что также отсутствует метод с именем SendMessage.

Отсутствует анализатор JSON на клиенте

SignalR требует наличия анализатора JSON для сериализации вызовов между сервером и клиентом.Если у вашего клиента нет встроенного анализатора JSON (например, Internet Explorer 7), вам необходимо включить его в ваше приложение.

Обновление

В ответ на ваши комментарии я бы посоветовал вам попробовать один из Azure SignalR образцов, таких как Начало работы с SignalR: пример чата , чтобы увидеть, если вы получитетакое же поведение.

Надеюсь, это поможет!

...