如何在Microsoft Bot Framework中用session存用户信息实现差异化问候语
实现方案
- 首先定义用于存储用户访问信息的实体类:
public class UserVisitData { // 存储用户上次访问日期 public DateTime LastVisitDate { get; set; } // 存储用户名 public string UserName { get; set; } }
- 按照你使用的Bot Framework版本选择对应实现逻辑:
Bot Framework v3 版本
直接通过session.UserData读写用户持久化数据即可,示例代码:
private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) { var today = DateTime.Now.Date; // 读取用户上次访问日期 var isFirstVisitToday = !context.UserData.TryGetValue("LastVisitDate", out DateTime lastVisit) || lastVisit.Date != today; if (isFirstVisitToday) { // 当日首次访问 await context.PostAsync("Hi, how can I help You"); // 写入访问日期和用户名,用户名从会话上下文的From属性获取 var userName = context.Activity.From.Name; context.UserData.SetValue("LastVisitDate", today); context.UserData.SetValue("UserName", userName); } else { // 当日非首次访问,读取已存储的用户名拼接欢迎语 var userName = context.UserData.GetValue<string>("UserName"); await context.PostAsync($"Welcome back '{userName}', how can I help you"); } context.Wait(MessageReceivedAsync); }
Bot Framework v4 版本
需要先注入UserState服务,再通过状态访问器读写数据,示例代码:
// 首先在Startup.cs中注册UserState服务 services.AddSingleton<UserState>(); // 机器人类中的实现逻辑 public class CustomBot : ActivityHandler { private readonly UserState _userState; private readonly IStatePropertyAccessor<UserVisitData> _userVisitDataAccessor; public CustomBot(UserState userState) { _userState = userState; _userVisitDataAccessor = _userState.CreateProperty<UserVisitData>(nameof(UserVisitData)); } protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken) { var today = DateTime.Now.Date; // 读取用户已存储的访问数据,没有则返回新实例 var userVisitData = await _userVisitDataAccessor.GetAsync( turnContext, () => new UserVisitData(), cancellationToken); if (userVisitData.LastVisitDate.Date != today) { // 当日首次访问 await turnContext.SendActivityAsync("Hi, how can I help You", cancellationToken: cancellationToken); userVisitData.LastVisitDate = today; userVisitData.UserName = turnContext.Activity.From.Name; } else { // 当日非首次访问 await turnContext.SendActivityAsync( $"Welcome back '{userVisitData.UserName}', how can I help you", cancellationToken: cancellationToken); } // 保存更新后的用户状态 await _userState.SaveChangesAsync(turnContext, false, cancellationToken); } }
注意:默认的内存状态存储仅适用于本地测试,生产环境请替换为持久化存储方案,避免服务重启后用户数据丢失。
内容的提问来源于stack exchange,提问作者Ammu
相关产品推荐
相关产品推荐

