C# 如何发送聊天记录?SendConversationHistoryAsync()不工作

C# 如何发送聊天记录?SendConversationHistoryAsync()不工作,c#,botframework,C#,Botframework,对话历史记录有一个示例: 事实上,在我试图运行它时,发送成绩单不起作用。具体而言,这一行: await connectorClient.Conversations.SendConversationHistoryAsync(activity.Conversation.Id, transcript, cancellationToken: cancellationToken); 我得到以下例外情况: 会话历史>失败: Microsoft.BotBuilderSamples.ConversationH

对话历史记录有一个示例:

事实上,在我试图运行它时,发送成绩单不起作用。具体而言,这一行:

await connectorClient.Conversations.SendConversationHistoryAsync(activity.Conversation.Id, transcript, cancellationToken: cancellationToken);
我得到以下例外情况:

会话历史>失败: Microsoft.BotBuilderSamples.ConversationHistoryBot[0] 会话历史>捕获到异常: System.Threading.Tasks.TaskCanceledException:该操作已完成 取消。-->System.IO.IOException:无法从中读取数据 传输连接:由于以下原因,I/O操作已中止: 线程退出或应用程序请求。--> System.Net.Sockets.SocketException:I/O操作已中止 因为线程退出或应用程序请求 ConversationHistory>---内部异常堆栈跟踪结束 ---会话历史>位于System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThroweException(SocketError 错误)会话历史>在 System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.GetResult(Int16 令牌)会话历史>在 System.Net.Http.HttpConnection.FillAsync()会话历史>
在 System.Net.Http.HttpConnection.ReadNextResponseHeaderLineAsync(布尔值 折叠标题(允许)对话历史>在 System.Net.Http.HttpConnection.SendAsyncCore(HttpRequestMessage 请求、取消令牌(取消令牌)会话历史>
---内部异常堆栈跟踪结束---ConversationHistory>at Microsoft.BotBuilderSamples.ConversationHistoryBot.OnTurnAsync(iTunesContext turnContext,CancellationToken CancellationToken)中的 C:\Users\Oyen\source\repos\BotBuilder Samples\Samples\csharp\u dotnetcore\22.conversation history\conversation historybot.cs:line 99对话历史>在 Microsoft.Bot.Builder.TranscriptLoggerMiddleware.OnTurnAsync(iTunesContext turnContext、NextDelegate、nextTurn、CancellationToken 取消令牌)在 D:\a\1\s\libraries\Microsoft.Bot.Builder\TranscriptLoggerMiddleware.cs:line 105对话历史>在 Microsoft.Bot.Builder.MiddlewareSet.ReceiveActivityWithStatusAsync(iTunesContext turnContext、BotCallbackHandler回调、CancellationToken 取消令牌)在 D:\a\1\s\libraries\Microsoft.Bot.Builder\MiddlewareSet.cs:第55行 会话历史>在 Microsoft.Bot.Builder.BotAdapter.RunPipelineAsync(iTunesContext turnContext、BotCallbackHandler回调、CancellationToken 取消令牌)在 D:\a\1\s\libraries\Microsoft.Bot.Builder\BotAdapter.cs:第167行

我可以确认转录本文件保存在我的blob存储中,并且我可以迭代从blob检索到的活动

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


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

对话历史样本的功能与预期一致。但是,当使用WebChatEmulator频道时,必须更新
活动.Id
s。否则,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);

会话历史记录示例按预期运行。但是,当使用WebChatEmulator频道时,必须更新
活动.Id
s。否则,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);

您正在使用哪个版本的仿真器?我能够在emulator V3上重现
TaskCancelled
异常(包括包含转录本日志的blob存储文件夹),但bot在上的工作与预期一样。关于第2点,在确认API调用成功的方法中,实际的转录本应显示为活动对象数组。@MarkB I使用的是emulator V3。感谢emulator V4提示。我将切换到预览版V4-看起来我错过了。您正在使用哪个版本的模拟器?我能够在emulator V3上重现
TaskCancelled
异常(包括包含转录本日志的blob存储文件夹),但bot在上的工作与预期一样。关于第2点,在确认API调用成功的方法中,实际的转录本应显示为活动对象数组。@MarkB I使用的是emulator V3。感谢emulator V4提示。我将切换到预览版V4-看起来我已经错过了。这些都是很好的提示!非常感谢。我的问题是通过使用v4模拟器而不是上面评论中推荐的v3来解决的。这些都是很好的提示!非常感谢。我的问题是通过使用v4仿真器而不是上面评论中推荐的v3来解决的。