You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 14:54:03