暂时存储特定用户的会话

我尝试使用IActivityLogger捕获用户的对话,有没有办法将用户和机器人的对话编译为临时持有者,如变量或会话? 我需要暂时将它存储在只有当用户想要与真人而不是机器人交谈时才能使用的地方。 将发送包含用户和机器人的先前对话的电子邮件。 我不想将其保存到数据库,因为有些用户不会选择这样做。

参见使用的代码。 记录器类:

public class Logger:IActivityLogger { public async Task LogAsync(IActivity activity) { var a = ($"From:{activity.From.Id} - To:{activity.Recipient.Id} - Message:{activity.AsMessageActivity()?.Text}" + "\b\r"); } } 

全球Asax:

 protected void Application_Start() { var builder = new ContainerBuilder(); builder.RegisterType().AsImplementedInterfaces().InstancePerDependency(); builder.Update(Conversation.Container); GlobalConfiguration.Configure(WebApiConfig.Register); } 

正如Ezequiel在评论中所建议的那样,您可以将活动存储在字典中。 就像是:

 public class Logger : IActivityLogger { public static ConcurrentDictionary> Messages = new ConcurrentDictionary>(); public Task LogAsync(IActivity activity) { var list = new List() { activity }; Messages.AddOrUpdate(activity.Conversation.Id, list, (k, v) => { v.Add(activity); return v; }); return Task.FromResult(false); } } 

然后将它们发送给用户:

 case ActivityTypes.Message: if (!string.IsNullOrEmpty(activity.Text) && activity.Text.ToLower() == "history") { using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity)) { var reply = activity.CreateReply(); var storedActivities = new List(); var found = Logger.Messages.TryGetValue(activity.Conversation.Id, out storedActivities); if (storedActivities != null) { foreach (var storedActivity in storedActivities) { reply.Text += $"\n\n {storedActivity.From.Name}: {storedActivity.AsMessageActivity().Text}"; } } else { reply.Text = "no history yet"; } //or, send an email here... var client = scope.Resolve(); await client.Conversations.ReplyToActivityAsync(reply); } } else await Conversation.SendAsync(activity, MakeRootDialog); break; 

您还需要在某个时候从列表中删除对话。 您可能想要某种过期策略,因为并非每个频道都会通知机器人用户已离开对话。

我已经探讨了保留对话记录的原因完全相同 – 将对话交给人工代理。 唯一的区别是我的代码使用node.js SDK。 看看你是否可以将它移植到C#:

http://www.pveller.com/smarter-conversations-part-4-transcript/