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

Bot Framework(.NET Core)如何实现用户离开对话后删除其对应存储文件

基于Bot Framework(.NET Core)的用户文件自动清理可行方案

Bot Framework本身没有全渠道通用的「用户离开对话」原生触发事件,不同渠道的会话结束逻辑差异较大,以下是3种可落地的实现方案:

方案1:监听渠道原生会话结束事件(适合特定渠道场景)

  • 部分渠道(如Teams、自定义Web Chat)会主动发送EndOfConversation类型的Activity活动,你可以在机器人的OnTurnAsync方法或者自定义中间件中捕获该事件,拿到用户唯一标识UserId后删除对应目录即可
  • 核心实现参考:
protected override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default)
{
    // 捕获会话结束事件
    if (turnContext.Activity.Type == ActivityTypes.EndOfConversation)
    {
        var userId = turnContext.Activity.From.Id;
        // 按用户ID划分的存储目录
        var userDir = Path.Combine(_webHostEnvironment.WebRootPath, "user_files", userId);
        if (Directory.Exists(userDir))
        {
            Directory.Delete(userDir, recursive: true);
        }
    }
    await base.OnTurnAsync(turnContext, cancellationToken);
}
  • 限制:仅支持主动发送EndOfConversation事件的渠道,无法适配全渠道。

方案2:定时扫描清理(全渠道通用,新手推荐)

这是兼容性最高、实现成本最低的方案,不依赖渠道特性:

  • 首先规范存储规则:所有用户文件都按UserId划分独立子目录存储,避免混存
  • 用.NET Core自带的IHostedService实现后台定时任务,定期扫描wwwroot下的用户文件目录,清理最后访问时间超过阈值的目录
  • 定时任务核心实现:
public class UserFileCleanupService : BackgroundService
{
    private readonly IWebHostEnvironment _webHostEnvironment;
    // 扫描间隔:每1小时执行一次清理
    private const int CleanupIntervalHours = 1;
    // 文件过期阈值:超过24小时无访问的用户目录将被删除
    private const int FileExpirationHours = 24;

    public UserFileCleanupService(IWebHostEnvironment webHostEnvironment)
    {
        _webHostEnvironment = webHostEnvironment;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var userFilesRoot = Path.Combine(_webHostEnvironment.WebRootPath, "user_files");
            if (Directory.Exists(userFilesRoot))
            {
                var allUserDirs = Directory.GetDirectories(userFilesRoot);
                foreach (var dir in allUserDirs)
                {
                    var lastAccessTime = Directory.GetLastAccessTime(dir);
                    if (DateTime.Now - lastAccessTime > TimeSpan.FromHours(FileExpirationHours))
                    {
                        Directory.Delete(dir, recursive: true);
                    }
                }
            }
            await Task.Delay(TimeSpan.FromHours(CleanupIntervalHours), stoppingToken);
        }
    }
}
  • 在Program.cs中注册服务即可生效:
builder.Services.AddHostedService<UserFileCleanupService>();
  • 优化点:每次用户访问自身文件时,主动更新对应目录的最后访问时间,避免用户还在会话中文件被误删。

方案3:基于状态过期回调清理(适合高实时性需求场景)

  • 利用Bot Framework的UserState特性,给每个用户的状态设置过期时间,自定义状态存储的过期回调逻辑,当用户状态过期时触发文件删除。该方案实现复杂度高于定时扫描,适合对清理实时性要求很高的业务场景。

通用注意事项

  • 删除文件前做好路径校验,避免误删wwwroot下的公共系统文件
  • 建议给删除操作添加操作日志,方便后续排查问题
  • 不要用会话ID作为唯一目录标识,同一用户可能开启多个会话,优先用UserId做目录划分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:15:04