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

微软Bot Framework(C#)如何判断新老用户?有无便捷实现方式?

在Bot Framework(C#)中判断首次/回头用户的简便方法

好问题!在微软Bot Framework(C#)里,你完全不用从零实现这个功能——框架已经提供了现成的持久化状态管理机制,能轻松实现类似Dialogflow中app.getLastSeen()的效果,比手动写存储逻辑省心太多。

核心是利用UserState组件,它专门用来存储跨会话的用户级持久化数据,框架会帮你处理数据的存储和读取,不用你操心底层细节。下面是具体的实现步骤:

1. 定义用户状态实体类

首先创建一个简单的类,用来存储我们需要追踪的用户信息,比如首次交互时间:

public class UserProfile
{
    // 存储用户首次与Bot交互的时间戳,可为空表示未记录
    public DateTimeOffset? FirstInteractionTime { get; set; }
}

2. 注入并初始化UserState

在你的Bot类中,注入UserState并创建一个状态属性访问器,用来读写上面定义的UserProfile:

private readonly UserState _userState;
private readonly IStatePropertyAccessor<UserProfile> _userProfileAccessor;

// 通过构造函数注入UserState
public YourBot(UserState userState)
{
    _userState = userState ?? throw new ArgumentNullException(nameof(userState));
    // 创建一个名为"UserProfile"的状态属性访问器
    _userProfileAccessor = _userState.CreateProperty<UserProfile>("UserProfile");
}

3. 在对话逻辑中判断用户类型

在处理每一轮对话的OnTurnAsync方法里,读取用户状态并判断是否为首次交互:

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
    // 获取用户状态,若不存在则初始化一个新的UserProfile
    var userProfile = await _userProfileAccessor.GetAsync(turnContext, () => new UserProfile());

    if (userProfile.FirstInteractionTime == null)
    {
        // 首次交互的用户
        await turnContext.SendActivityAsync("嗨!欢迎第一次和我聊天😊");
        // 记录首次交互时间
        userProfile.FirstInteractionTime = DateTimeOffset.Now;
    }
    else
    {
        // 回头用户,还可以计算上次间隔
        var timeElapsed = DateTimeOffset.Now - userProfile.FirstInteractionTime.Value;
        await turnContext.SendActivityAsync($"欢迎回来!距离你上次来访已经过去{timeElapsed.Days}天{timeElapsed.Hours}小时啦~");
    }

    // 务必保存状态,否则下次会话会丢失数据
    await _userState.SaveChangesAsync(turnContext, false, cancellationToken);

    // 继续处理其他对话逻辑...
    await base.OnTurnAsync(turnContext, cancellationToken);
}

额外说明

  • UserState默认使用内存存储(仅适合开发测试),生产环境可以配置Azure Cosmos DB、SQL Server等持久化存储,框架会自动适配,不需要修改业务代码。
  • 如果你只需要简单判断是否为首次用户,也可以把FirstInteractionTime换成一个布尔值IsFirstVisit,逻辑会更简洁。

这样你就不用自己实现用户识别和状态存储的逻辑,完全依托框架的能力就能完成需求啦~

内容的提问来源于stack exchange,提问作者Andreas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:16:14