Почему Azure SignalR не отправляет сообщения, опубликованные функциями Azure? - PullRequest
0 голосов
/ 15 июня 2019

Я развернул набор функций Azure (v2).

Я хочу, чтобы приложение iOS получало уведомление, когда что-то происходит на стороне сервера, поэтому я создал службу Azure SignalR, настроенную как Serverless.

enter image description here

Я создал и развернул новую negotiate функцию Azure, как объяснено в документации , которая публикует информацию о подписке в очереди служебной шины:

[FunctionName("negotiate")]
public async Task<SignalRConnectionInfo> Negotiate(
    [HttpTrigger(AuthorizationLevel.Anonymous)]
    HttpRequest httpRequest,
    ClaimsPrincipal claimsPrincipal,
    [SignalRConnectionInfo(HubName = "updates", UserId = "{headers.x-ms-client-principal-id}")]
    SignalRConnectionInfo connectionInfo)
{
        try
        {
              //  Uses the name identifier for now.
              Claim nameIdentifierClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);

             string userId = nameIdentifierClaim.Value;

             foreach (Guid groupId in claimsPrincipal.GetGroups())
             {
                 var subscription = new SynchronizationSubscriptionContract {UserId = userId, GroupId = groupId};
                 await m_serviceBus.SendAsync(JsonConvert.SerializeObject(subscription));
             }

             return connectionInfo;
       }
       catch (Exception exc)
       {
           // 
       }
}

Шина обслуживания привязана к функции Azure, которая добавляет пользователя в список групп:

[ServiceBusAccount(Constants.Configuration.ServiceBusConnectionString)]
[FunctionName("subscribe")]
public async Task AddToGroupAsync(
        [ServiceBusTrigger("synchronization-subscriptions")] string requestMessage,
        [SignalR(HubName = "updates")] IAsyncCollector<SignalRGroupAction> signalRGroupActions)
{
      var synchronizationSubscriptionContract = JsonConvert.DeserializeObject<SynchronizationSubscriptionContract>(requestMessage);

      string groupName = synchronizationSubscriptionContract.GroupId;

      var addGroupAction = new SignalRGroupAction
      {
          UserId = synchronizationSubscriptionContract.UserId,
          GroupName = groupName,
          Action = GroupAction.Add
      };

      await signalRGroupActions.AddAsync(addGroupAction);
}

Пока все хорошо.

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

[ServiceBusAccount(Constants.Configuration.ServiceBusConnectionString)]
   [FunctionName(Api.Functions.Synchronization.UpdateSynchronizationInfo)]
public async Task Run(
       [ServiceBusTrigger("synchronization-requests")] string requestMessage,
       [SignalR(HubName = "updates")]
       IAsyncCollector<SignalRMessage> signalRMessages
)
{
     var requestContract = JsonConvert.DeserializeObject<SynchronizationUpdateRequestContract>(requestMessage);

     var request = m_mapper.Map<SynchronizationUpdateRequest>(requestContract);

    // Do more stuff.

    string groupName = request.GroupId;

    var updateMessage = new SignalRMessage
    {
        GroupName = groupName,
        Target = "notify",
        Arguments = new string[] {}
    };

    await signalRMessages.AddAsync(updateMessage);

}

На основании журналов, которые я добавил в разных местах в функциях Azure, я не вижу ошибок, и все, кажется, вызывается правильно. Однако я не вижу никаких сообщений на signalR: количество сообщений остается равным 0, даже если количество подключений увеличивается. Моя заявка не получила никаких сообщений.

Connections

Messages

Вопрос

Почему сообщения не отправляются в Azure SignalR? Чего мне не хватает?

1 Ответ

0 голосов
/ 15 июня 2019

Ничего себе.

Похоже, что сообщение отброшено, если свойство Arguments является пустым списком.

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

var updateMessage = new SignalRMessage
{
    GroupName = groupName,     
    Target = "notify",
    Arguments = new[] { "Lulz" }
};
...