Почему Azure SignalR не отправляет сообщения, опубликованные функциями Azure?

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

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

введите здесь описание изображения

Я создал и развернул новую 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, даже если количество подключений увеличивается. Мое приложение не получало сообщений.

Связи

Сообщения

Вопрос

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


person Kzrystof    schedule 14.06.2019    source источник
comment
Не могли бы вы поделиться подробностями о вашем функциональном приложении, чтобы мы могли провести расследование с нашей стороны? Нам нужно будет знать временные рамки проблемы, имя вашего приложения-функции (вы можете поделиться им privately) и регион. Идентификаторы вызовов выполнения, которые должны были отправить сообщение signalR, но не отправили его, также помогут нам выявить любые проблемы на нашей стороне.   -  person Katy Shimizu    schedule 15.06.2019


Ответы (1)


Вот это да.

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

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

var updateMessage = new SignalRMessage
{
    GroupName = groupName,     
    Target = "notify",
    Arguments = new[] { "Lulz" }
};
person Kzrystof    schedule 14.06.2019