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
相关产品推荐
相关产品推荐

