加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 暂时存储特定用户的会话

发布时间:2020-12-15 21:06:00 所属栏目:百科 来源:网络整理
导读:我尝试使用IActivityLogger捕获用户的对话,有没有办法将用户和机器人的对话编译为临时持有者,如变量或会话?我需要暂时将它存储在只有当用户想要与真人而不是机器人交谈时才能使用的地方.将发送包含用户和机器人的先前对话的电子邮件.我不想将其保存到数据库
我尝试使用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}" + "br");
    }
}

全球Asax:

protected void Application_Start()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<Logger>().AsImplementedInterfaces().InstancePerDependency();
        builder.Update(Conversation.Container);

        GlobalConfiguration.Configure(WebApiConfig.Register);

    }

解决方法

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

public class Logger : IActivityLogger
{
    public static ConcurrentDictionary<string,List<IActivity>> Messages = new ConcurrentDictionary<string,List<IActivity>>();

    public Task LogAsync(IActivity activity)
    {
        var list = new List<IActivity>() { 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<IActivity>();
            var found = Logger.Messages.TryGetValue(activity.Conversation.Id,out storedActivities);
            if (storedActivities != null)
            {
                foreach (var storedActivity in storedActivities)
                {
                    reply.Text += $"nn {storedActivity.From.Name}: {storedActivity.AsMessageActivity().Text}";
                }
            }
            else
            {
                reply.Text = "no history yet";
            }

            //or,send an email here...
            var client = scope.Resolve<IConnectorClient>();
            await client.Conversations.ReplyToActivityAsync(reply);
        }                               
    }
    else
        await Conversation.SendAsync(activity,MakeRootDialog);
    break;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读