ABP创建租户调用_tenantStore.FindAsync出现TaskCanceledException如何解决
异常根因
问题的核心是查询租户配置的代码放在了租户上下文切换的范围内:ITenantStore 默认遵循ABP的全局租户过滤器,当你通过_currentTenant.Change(tenantId)切换到目标租户上下文后,调用_tenantStore.FindAsync会尝试从目标租户的数据库中查询SaasTenants表,但此时租户数据库尚未完成初始化,甚至连有效连接都无法建立,导致查询长时间无响应,最终触发超时抛出任务取消异常。
你之前调整工作单元超时、开启MARS的操作都无法解决问题,因为问题本质是查询路由到了错误的数据库实例,和查询超时、结果集配置无关。
解决方案
将查询租户配置的代码移动到租户上下文切换块之外,在宿主上下文环境下完成租户配置查询后,再切换到租户上下文执行后续的迁移、初始化逻辑,修改后的代码参考如下:
private async Task MigrateAndSeedForTenantAsync( Guid tenantId, string adminEmail, string adminPassword) { try { // 先在宿主上下文查询租户配置 var tenantConfiguration = await _tenantStore.FindAsync(tenantId); using (_currentTenant.Change(tenantId)) { // Create database tables if needed using (var uow = _unitOfWorkManager.Begin(requiresNew: true, isTransactional: false, timeout: TimeSpan.FromMinutes(10).TotalMilliseconds.To<Int32>())) { // 后续代码直接使用已经查询到的tenantConfiguration即可 // 后续代码… } } } }
内容的提问来源于stack exchange,提问作者jlavallet
相关产品推荐
相关产品推荐

