【问题标题】:How do I send chat transcript? SendConversationHistoryAsync() not working如何发送聊天记录? SendConversationHistoryAsync()不起作用
【发布时间】:2019-04-10 10:21:55
【问题描述】:

有一个对话历史示例:https://github.com/Microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/22.conversation-history

在我尝试运行它时,实际上发送脚本不起作用。特别是这一行:

await connectorClient.Conversations.SendConversationHistoryAsync(activity.Conversation.Id, transcript, cancellationToken: cancellationToken);

我得到以下异常:

ConversationHistory> 失败: Microsoft.BotBuilderSamples.ConversationHistoryBot[0] ConversationHistory> 捕获异常: System.Threading.Tasks.TaskCanceledException:操作是 取消。 ---> System.IO.IOException: 无法从 传输连接:I/O 操作已中止,因为 线程退出或应用程序请求。 ---> System.Net.Sockets.SocketException:I/O 操作已中止 由于线程退出或应用程序请求 ConversationHistory> --- 内部异常堆栈跟踪结束 --- ConversationHistory> 在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError 错误)对话历史>在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult(Int16 令牌)对话历史>在 System.Net.Http.HttpConnection.FillAsync() ConversationHistory>
在 System.Net.Http.HttpConnection.ReadNextResponseHeaderLineAsync(布尔 foldedHeadersAllowed) ConversationHistory> 在 System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage 请求,CancellationToken cancelToken) ConversationHistory>
--- 内部异常堆栈跟踪结束 --- ConversationHistory> at Microsoft.BotBuilderSamples.ConversationHistoryBot.OnTurnAsync(ITurnContext turnContext, CancellationToken cancelToken) 在 C:\Users\Oyen\source\repos\BotBuilder-Samples\samples\csharp_dotnetcore\22.conversation-history\ConversationHistoryBot.cs:line 99对话历史>在 Microsoft.Bot.Builder.TranscriptLoggerMiddleware.OnTurnAsync(ITurnContext turnContext, NextDelegate nextTurn, CancellationToken 取消令牌)在 D:\a\1\s\libraries\Microsoft.Bot.Builder\TranscriptLoggerMiddleware.cs:line 105对话历史>在 Microsoft.Bot.Builder.MiddlewareSet.ReceiveActivityWithStatusAsync(ITurnContext turnContext、BotCallbackHandler 回调、CancellationToken 取消令牌)在 D:\a\1\s\libraries\Microsoft.Bot.Builder\MiddlewareSet.cs:55 行 对话历史>在 Microsoft.Bot.Builder.BotAdapter.RunPipelineAsync(ITurnContext turnContext、BotCallbackHandler 回调、CancellationToken 取消令牌)在 D:\a\1\s\libraries\Microsoft.Bot.Builder\BotAdapter.cs:167 行

我可以确认脚本文件保存在我的 blob 存储中,并且我可以遍历从 blob 中检索到的活动。

(1) 要让 SendConversationHistoryAsync() 工作,我缺少什么?

(2) 实际成绩单在发送时是什么样的? (仅遍历我的活动并处理每种活动类型并制作我自己的对话历史消息是否值得?)

【问题讨论】:

  • 您使用的是哪个版本的模拟器?我能够在模拟器 V3 上重现 TaskCancelled 异常(包括包含脚本日志的 blob 存储文件夹),但机器人在 emulator v4 上按预期工作。
  • 关于第 2 点,实际的成绩单应显示为确认 API 调用成功的方法中的活动对象数组。
  • @MarkB 我使用的是模拟器 V3。感谢模拟器 V4 提示。我将切换到预览版 V4 - 看起来我错过了。

标签: c# botframework


【解决方案1】:

ConversationHistory 示例按预期运行。但是,当使用 WebChatEmulator 频道时,必须更新 Activity.Ids。否则,如果已经存在,WebChat 控件将过滤掉它们:

bool updateActivities = new[] { Channels.Webchat, Channels.Emulator, Channels.Directline, }
                             .Contains(activity.ChannelId);
var incrementId = 0;
//get current id to ensure we do not overlap
if (updateActivities && activity.Id.Contains("|"))
{
     int.TryParse(activity.Id.Split('|')[1], out incrementId);
}

/* get activities */

foreach (var a in activities)
{
  incrementId++;
  a.Id = string.Concat(activity.Conversation.Id, "|", incrementId.ToString().PadLeft(7, '0'));
  a.Timestamp = DateTimeOffset.UtcNow;
  a.ChannelData = string.Empty; // WebChat uses ChannelData for id comparisons, so clear it
}

var transcript = new Transcript(activities);

await connectorClient.Conversations.SendConversationHistoryAsync(activity.Conversation.Id, 
                                transcript, cancellationToken: cancellationToken);

【讨论】:

  • 这些是很好的建议!谢谢你。我的问题通过使用 v4 模拟器而不是上面 cmets 中推荐的 v3 解决了。
猜你喜欢
  • 2014-01-31
  • 1970-01-01
  • 2016-08-24
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多