为什么 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" }
};
我已经部署了一套 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" }
};