[英]BotFramework v4 .NET SDK: send typing indicator doesn't work properly
使用 .NET SDK BotFramework v4。 我正在尝试为机器人的每个答案添加一个打字指示器。
1)第一种方法:
var reply = MessageFactory.Attachment(attachments);
reply.AttachmentLayout = AttachmentLayoutTypes.Carousel;
reply.Type = ActivityTypes.Typing;
await turnContext.SendActivityAsync(reply, cancellationToken);
还试过:
var typingMsg = stepContext.Context.Activity.CreateReply();
typingMsg.Type = ActivityTypes.Typing;
typingMsg.Text = "some text";
await stepContext.Context.SendActivityAsync(typingMsg);
但是对于两者来说,机器人只用打字指示符回答,没有文本,并不断地无限循环地发送它而不会停止
2)第二种方法:我使用了ShowTypingMiddleware
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
CancellationTokenSource cts = null;
if (turnContext.Activity.Type == ActivityTypes.Message)
{
cts = new CancellationTokenSource();
cancellationToken.Register(() => cts.Cancel());
var task = Task.Run(() => SendTypingAsync(turnContext, _delay, _period, cts.Token), cancellationToken);
DialogContext dc = await dialogs.CreateContextAsync(turnContext, cancellationToken);
// Continue any current dialog.
DialogTurnResult dialogTurnResult = await dc.ContinueDialogAsync();
var conversationStateAccessors = ConversationState.CreateProperty<ConversationData>(nameof(ConversationData));
var conversationData = await conversationStateAccessors.GetAsync(turnContext, () => new ConversationData());
if (conversationData != null)
{
var messageTimeOffset = (DateTimeOffset)turnContext.Activity.Timestamp;
var localMessageTime = messageTimeOffset.ToLocalTime();
conversationData.Timestamp = localMessageTime.ToString();
conversationData.ChannelId = turnContext.Activity.ChannelId.ToString();
}
var dialogsExist = dialogs.GetDialogs();
// First, we use the dispatch model to determine which cognitive service (LUIS or QnA) to use.
var recognizerResult = await _botServices.Dispatch.RecognizeAsync(turnContext, cancellationToken);
// Top intent tell us which cognitive service to use.
var (intent, _) = recognizerResult.GetTopScoringIntent();
// Next, we call the dispatcher with the top intent.
await DispatchToTopIntentAsync(turnContext, dc, intent, recognizerResult, cancellationToken);
}
if (cts != null)
{
cts.Cancel();
}
await _accessors.ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
}
打字指示器为第一个回答者显示,但在接下来的答案中不再出现。
解决办法是什么? 谢谢!
我找到了解决方案。
我们应该使用dialogContext而不是turnContext 。
在OnTurnAsync函数中,使用这个:
DialogContext dc = await dialogs.CreateContextAsync(turnContext, cancellationToken);
Activity replyTyping = turnContext.Activity.CreateReply();
replyTyping.Type = ActivityTypes.Typing;
await dc.Context.SendActivityAsync(replyTyping);
await Task.Delay(3000);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.