From 39bd3f0854b865f99591d96108e3b1e4eb9483a4 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 7 Apr 2026 09:03:07 +0800 Subject: [PATCH] Do not short-circuit tenant resolver chain when query string tenant value is blank --- .../QueryStringTenantResolveContributor.cs | 7 ++----- ...eMultiTenancy_Without_DomainResolver_Tests.cs | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs index 49fb0dc620..47f3b8eb99 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/QueryStringTenantResolveContributor.cs @@ -19,13 +19,10 @@ public class QueryStringTenantResolveContributor : HttpTenantResolveContributorB if (httpContext.Request.Query.ContainsKey(tenantKey)) { var tenantValue = httpContext.Request.Query[tenantKey].ToString(); - if (tenantValue.IsNullOrWhiteSpace()) + if (!tenantValue.IsNullOrWhiteSpace()) { - context.Handled = true; - return Task.FromResult(null); + return Task.FromResult(tenantValue)!; } - - return Task.FromResult(tenantValue)!; } } diff --git a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs index 1f53e36260..24cdc3591a 100644 --- a/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs +++ b/framework/test/Volo.Abp.AspNetCore.MultiTenancy.Tests/Volo/Abp/AspNetCore/MultiTenancy/AspNetCoreMultiTenancy_Without_DomainResolver_Tests.cs @@ -70,4 +70,20 @@ public class AspNetCoreMultiTenancy_Without_DomainResolver_Tests : AspNetCoreMul var result = await GetResponseAsObjectAsync>("http://abp.io"); result["TenantId"].ShouldBe(_testTenantId.ToString()); } + + [Fact] + public async Task Should_Use_Header_Tenant_Id_When_QueryString_Tenant_Is_Empty() + { + Client.DefaultRequestHeaders.Add(_options.TenantKey, _testTenantId.ToString()); + + var result = await GetResponseAsObjectAsync>($"http://abp.io?{_options.TenantKey}="); + result["TenantId"].ShouldBe(_testTenantId.ToString()); + } + + [Fact] + public async Task Should_Fallback_To_Host_When_QueryString_Tenant_Is_Empty_And_No_Other_Resolver() + { + var result = await GetResponseAsObjectAsync>($"http://abp.io?{_options.TenantKey}="); + result["TenantId"].ShouldBe(""); + } }