为什么 Azure SignalR 不发送 Azure Functions 发布的消息?

Why isn't Azure SignalR sending the messages published by the Azure Functions?

我已经部署了一套 Azure Functions (v2)。

我希望在服务器端发生某些事情时通知 iOS 应用程序,因此我创建了一个 Azure SignalR 服务,配置为 Serverless

我已经创建并部署了一个新的 negotiate Azure 函数,如 in the documentation 所述,它在服务总线队列上发布订阅信息:

[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 Functions 之一需要在 SignalR 通道上发布消息,它就会在绑定到另一个 Azure Functions 的专用服务总线队列上发送消息。然后 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 Functions 中不同位置添加的日志,我没有看到任何错误,似乎一切都被正确调用了。但是,我在 signalR 上看不到任何消息:即使连接数增加,消息数仍保持为 0。我的应用程序没有收到任何消息。

问题

为什么消息没有发送到 Azure SignalR?我错过了什么?

哇。

如果 Arguments 属性 是一个空列表,则消息似乎被丢弃。

当我将 Message 实例更改为以下内容时,它立即起作用:

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