ASP.NET Web API查询已登录用户(Status=true)过滤失效问题
问题描述
实现查询所有已登录用户的接口时过滤逻辑未生效,业务规则要求:用户Status属性值为true时代表已登录,Status为false的用户需要从返回列表中过滤,不对外展示。实际运行后所有Status为false的用户也被一并返回,过滤逻辑完全失效。
问题相关现有代码
Model定义
[Table("Contact")] public partial class Contact { [Key] public Guid Id { get; set; } public string DisplayName { get; set; } = null!; public string ProfilePic { get; set; } = null!; public int? Rating { get; set; } public bool? Status { get; set; } public bool? IsRegistration { get; set; } }
DbContext定义
public virtual DbSet<Contact> Contacts { get; set; } = null!;
Repository层实现
private readonly TalkBackContactsDbContext _context; public ContactsRepository(TalkBackContactsDbContext context) { _context = context; } public IQueryable<Contact> GetAllConnectedUser(Contact contact) { if (contact.Status == false) { throw new Exception("Not exist"); } else { return _context.Contacts; } }
API Controller层实现
private readonly IContactsRepository _repo; public ContactsController(IContactsRepository repo) { _repo = repo; } [HttpGet()] public IEnumerable<Contact> GetAllConnected() { var contact = new Contact(); try { return _repo.GetAllConnectedUser(contact); } catch (Exception e) { e.ToString(); } return _repo.GetAllConnectedUser(contact); }
问题根因
- Repository逻辑完全偏离需求:当前判断的是传入方法的参数对象的Status值,根本没有对数据库中存储的用户集合做过滤,只要传入参数的Status不等于false,就直接返回全量用户数据
- Controller传入的参数是手动new的空Contact实例,可空bool类型
Status默认值为null,Repository中contact.Status == false判断结果为false,直接进入else分支返回全量表数据 - Controller的异常捕获逻辑无效:catch块仅调用
e.ToString(),既不记录日志也不返回错误响应,捕获完成后还会再次调用Repository方法重复执行错误逻辑 - 全程没有编写针对用户表Status字段的筛选条件,自然无法过滤Status为false的未登录用户
修复后代码
调整Repository层方法
移除无意义的Contact入参,直接对用户数据集增加Where过滤条件:
private readonly TalkBackContactsDbContext _context; public ContactsRepository(TalkBackContactsDbContext context) { _context = context; } public IQueryable<Contact> GetAllConnectedUser() { // 筛选Status为true的已登录用户,兼容可空bool类型判断 return _context.Contacts.Where(c => c.Status == true); }
调整Controller层接口
删除冗余的空对象初始化、无效异常捕获逻辑,调用Repository方法时建议使用ToList()立即执行查询,避免DbContext释放后出现迭代异常:
private readonly IContactsRepository _repo; public ContactsController(IContactsRepository repo) { _repo = repo; } [HttpGet()] public IEnumerable<Contact> GetAllConnected() { return _repo.GetAllConnectedUser().ToList(); }
内容的提问来源于stack exchange,提问作者Tommy Udi
相关产品推荐
相关产品推荐

