我想在使用 Bot Framework SDK 为 Teams 中的机器人发送任何消息之前添加 "typing" 指示符

I want to add "typing" indicator before any message is being sent for bot in Teams using Bot Framework SDK

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
await turnContext.SendActivityAsync(MessageFactory.Text($"Welcome"));

我想在为 Teams 中的机器人发送欢迎之前添加 "typing" 指示符。 使用 BotFramework。

但是,我的机器人发送的每条消息之前都没有"typing",只是在几秒钟后出现。

如何在 C# 中实现?

添加到您的Startup.cs

 services.AddSingleton<ShowTypingMiddleware>();

那么你的AdapterWithErrorHandler.cs

public AdapterWithErrorHandler(ShowTypingMiddleware showTypingMiddleware)
            : base(configuration, logger)
{
...
Use(showTypingMiddleware);
...
}

@GiangNguyen 的回答是部分回答;如果您想在 每条 消息之前发送打字活动,您应该使用 ShowTypingMiddleware。我说这只是部分答案,因为我不相信这实际上适用于欢迎消息。


首先,快速说明一下 Teams 频道上的欢迎消息。他们是一个巨大的痛苦来测试。团队将用户与机器人的交互与机器人的 appId 联系起来,因此用户只能从机器人那里收到一次欢迎消息——他们是否隐藏或删除对话或机器人并不重要——他们只会收到欢迎消息 一次。为了测试而绕过这个问题,您有几个选择:

  1. 每次要测试这个时都创建一个新的App Registration(因为它会生成一个新的AppId),或者
  2. OnMessageAsync 中放置一些逻辑,调用您在 OnMembersAddedAsync() 中使用的相同代码。例如,如果您键入 "test welcome message",它将调用您在 OnMembersAddedAsync() (...if (turnContext.Activity.Text === "test welcome message"...) 中使用的相同代码,就像发送您实际的欢迎消息一样。使用它进行测试,然后您可以将其移除以进行生产。我推荐这种方法。

因此,使用 ShowTypingMiddleware 时不会为欢迎消息输入 activity 的原因是因为中间件仅在机器人收到消息时触发,而欢迎消息通常不会发生这种情况.相反,您需要手动发送输入 activity:

var typing = new Activity() { Type = ActivityTypes.Typing };
await turnContext.SendActivityAsync(typing);

话虽这么说,一些 channels/clients 与 ShowTypingMiddleware 斗争。如果您正在寻求故障排除方面的帮助并且此答案不适用,请告诉我您正在使用什么 channel/client 以及您使用什么代码来发送输入指示器,我会看看我是否仍然可以帮助。