我有以下系统组件:
ProcessMessageAsync
完成时向客户端发送消息。SignalR
配置为使用名称取自 UserName 的组。
public class NotificationHub : Hub
{
public override async Task OnConnectedAsync()
{
var userName = Context!.User!.Identity!.Name ?? "Empty";
var userGroupName = CreateUserGroupName(userName);
await Groups.AddToGroupAsync(Context.ConnectionId, userGroupName);
await base.OnConnectedAsync();
}
private static string CreateUserGroupName(string userName) => $"user_{userName}";
}
发送消息(从 ihostedservice)是这样发生的:
var userGroupName = CreateUserGroupName(userName ?? "Empty");
var group = _notificationHub.Clients.Group(userGroupName);
await group.SendAsync(
method: "OnReceived",
arg1: arg1);
当我从
ProcessMessageAsync
调用上述内容时,一切都很好。我在收入消息正文中有用户名(用于获取组名)。
现在,我想在 Azure 服务总线错误(来自
ProcessErrorAsync
回调)的情况下向客户 UI 发送 signalR 消息,但 ProcessErrorAsync
无权访问收入消息,因此无法访问用户名。如何获取 ProcessErrorAsync
中的用户名?这种情况一般怎么处理?
ProcessErrorAsync()
文档 说明
处理程序负责处理该处理器运行时抛出的未处理的异常。实施是强制性的。
有几种情况会调用此处理程序。最常见的是:
MaxDeliveryCount
没有被错误地设置为 1。失败的消息,无论有效与否,最终都会进入死信队列。死信队列可以使用其自己的处理器实例进行处理并发出 SignalR 消息(假设消息可以读取)。
TLDR:
ProcessErrorAsync()
不是用于消息处理,而是用于日志记录和指标。如果需要针对所有重试失败的消息的自定义逻辑,请使用死信队列。