From 4d69ddbc92ccae296f2ec7d60ce2983aa063a606 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 19 Oct 2020 14:30:46 +0800 Subject: [PATCH] Use sync to resolve the tenant. Resolve #5414 --- .../CookieTenantResolveContributor.cs | 9 +++++---- .../DomainTenantResolveContributor.cs | 19 ++++--------------- .../FormTenantResolveContributor.cs | 8 +++++--- .../HeaderTenantResolveContributor.cs | 9 +++++---- .../HttpTenantResolveContributerBase.cs | 13 +++++++------ .../QueryStringTenantResolveContributor.cs | 15 +++++++++++---- .../RouteTenantResolveContributor.cs | 12 ++++-------- .../ActionTenantResolveContributor.cs | 6 ++++-- .../CurrentUserTenantResolveContributor.cs | 13 +++++++------ .../MultiTenancy/ITenantResolveContributor.cs | 6 ++++-- .../Volo/Abp/MultiTenancy/ITenantResolver.cs | 5 +++-- .../TenantConfigurationProvider.cs | 2 +- .../TenantResolveContributorBase.cs | 7 ++++--- .../Volo/Abp/MultiTenancy/TenantResolver.cs | 9 ++++----- 14 files changed, 68 insertions(+), 65 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs index 7d4a109d9c..01d1f141b3 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/CookieTenantResolveContributor.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.MultiTenancy @@ -9,9 +10,9 @@ namespace Volo.Abp.AspNetCore.MultiTenancy public override string Name => ContributorName; - protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { - return httpContext.Request?.Cookies[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]; + return Task.FromResult(httpContext.Request?.Cookies[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs index 90cf3bfa81..70da395c2e 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/DomainTenantResolveContributor.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Volo.Abp.MultiTenancy; using Volo.Abp.Text.Formatting; @@ -22,26 +23,14 @@ namespace Volo.Abp.AspNetCore.MultiTenancy _domainFormat = domainFormat.RemovePreFix(ProtocolPrefixes); } - protected override string GetTenantIdOrNameFromHttpContextOrNull( - ITenantResolveContext context, - HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { - if (httpContext.Request?.Host == null) - { - return null; - } - var hostName = httpContext.Request.Host.Host.RemovePreFix(ProtocolPrefixes); var extractResult = FormattedStringValueExtracter.Extract(hostName, _domainFormat, ignoreCase: true); context.Handled = true; - if (!extractResult.IsMatch) - { - return null; - } - - return extractResult.Matches[0].Value; + return extractResult.IsMatch ? Task.FromResult(extractResult.Matches[0].Value) : null; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs index f334b4d434..868ef78519 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/FormTenantResolveContributor.cs @@ -1,4 +1,5 @@ using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Volo.Abp.MultiTenancy; @@ -10,14 +11,15 @@ namespace Volo.Abp.AspNetCore.MultiTenancy public override string Name => ContributorName; - protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) + protected async override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { - if (httpContext.Request == null || !httpContext.Request.HasFormContentType || !httpContext.Request.Form.Any()) + if (!httpContext.Request.HasFormContentType) { return null; } - return httpContext.Request.Form[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]; + var form = await httpContext.Request.ReadFormAsync(); + return form[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]; } } } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs index 25487f8b4d..24faa1d709 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HeaderTenantResolveContributor.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -13,9 +14,9 @@ namespace Volo.Abp.AspNetCore.MultiTenancy public override string Name => ContributorName; - protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { - if (httpContext.Request == null || httpContext.Request.Headers.IsNullOrEmpty()) + if (httpContext.Request.Headers.IsNullOrEmpty()) { return null; } @@ -33,7 +34,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy Log(context, $"HTTP request includes more than one {tenantIdKey} header value. First one will be used. All of them: {tenantIdHeader.JoinAsString(", ")}"); } - return tenantIdHeader.First(); + return Task.FromResult(tenantIdHeader.First()); } protected virtual void Log(ITenantResolveContext context, string text) @@ -44,4 +45,4 @@ namespace Volo.Abp.AspNetCore.MultiTenancy .LogWarning(text); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs index a5cfbffeb7..18f76ee711 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/HttpTenantResolveContributerBase.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; @@ -9,7 +10,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy { public abstract class HttpTenantResolveContributorBase : TenantResolveContributorBase { - public override void Resolve(ITenantResolveContext context) + public async override Task ResolveAsync(ITenantResolveContext context) { var httpContext = context.GetHttpContext(); if (httpContext == null) @@ -19,7 +20,7 @@ namespace Volo.Abp.AspNetCore.MultiTenancy try { - ResolveFromHttpContext(context, httpContext); + await ResolveFromHttpContextAsync(context, httpContext); } catch (Exception e) { @@ -29,15 +30,15 @@ namespace Volo.Abp.AspNetCore.MultiTenancy } } - protected virtual void ResolveFromHttpContext(ITenantResolveContext context, HttpContext httpContext) + protected virtual async Task ResolveFromHttpContextAsync(ITenantResolveContext context, HttpContext httpContext) { - var tenantIdOrName = GetTenantIdOrNameFromHttpContextOrNull(context, httpContext); + var tenantIdOrName = await GetTenantIdOrNameFromHttpContextOrNullAsync(context, httpContext); if (!tenantIdOrName.IsNullOrEmpty()) { context.TenantIdOrName = tenantIdOrName; } } - protected abstract string GetTenantIdOrNameFromHttpContextOrNull([NotNull] ITenantResolveContext context, [NotNull] HttpContext httpContext); + protected abstract Task GetTenantIdOrNameFromHttpContextOrNullAsync([NotNull] ITenantResolveContext context, [NotNull] HttpContext httpContext); } -} \ No newline at end of file +} 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 5144088d00..519c0931d1 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 @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; using Volo.Abp.MultiTenancy; namespace Volo.Abp.AspNetCore.MultiTenancy @@ -9,14 +10,20 @@ namespace Volo.Abp.AspNetCore.MultiTenancy public override string Name => ContributorName; - protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { - if (httpContext.Request == null || !httpContext.Request.QueryString.HasValue) + var tenantKey = context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey; + if (!httpContext.Request.QueryString.HasValue) { return null; } - return httpContext.Request.Query[context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey]; + if (httpContext.Request.Query.TryGetValue(tenantKey, out var tenant)) + { + Task.FromResult(tenant); + } + + return null; } } } diff --git a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs index 4548daeb04..2a5631ec32 100644 --- a/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.AspNetCore.MultiTenancy/Volo/Abp/AspNetCore/MultiTenancy/RouteTenantResolveContributor.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Volo.Abp.MultiTenancy; @@ -11,15 +12,10 @@ namespace Volo.Abp.AspNetCore.MultiTenancy public override string Name => ContributorName; - protected override string GetTenantIdOrNameFromHttpContextOrNull(ITenantResolveContext context, HttpContext httpContext) + protected override Task GetTenantIdOrNameFromHttpContextOrNullAsync(ITenantResolveContext context, HttpContext httpContext) { var tenantId = httpContext.GetRouteValue(context.GetAbpAspNetCoreMultiTenancyOptions().TenantKey); - if (tenantId == null) - { - return null; - } - - return Convert.ToString(tenantId); + return tenantId == null ? null : Task.FromResult(Convert.ToString(tenantId)); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs index c73075107e..0af00d647e 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ActionTenantResolveContributor.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using JetBrains.Annotations; namespace Volo.Abp.MultiTenancy @@ -18,9 +19,10 @@ namespace Volo.Abp.MultiTenancy _resolveAction = resolveAction; } - public override void Resolve(ITenantResolveContext context) + public override Task ResolveAsync(ITenantResolveContext context) { _resolveAction(context); + return Task.CompletedTask; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentUserTenantResolveContributor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentUserTenantResolveContributor.cs index d326421682..002a31bc6e 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentUserTenantResolveContributor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/CurrentUserTenantResolveContributor.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Users; @@ -9,16 +10,16 @@ namespace Volo.Abp.MultiTenancy public override string Name => ContributorName; - public override void Resolve(ITenantResolveContext context) + public override Task ResolveAsync(ITenantResolveContext context) { var currentUser = context.ServiceProvider.GetRequiredService(); - if (currentUser.IsAuthenticated != true) + if (currentUser.IsAuthenticated) { - return; + context.Handled = true; + context.TenantIdOrName = currentUser.TenantId?.ToString(); } - context.Handled = true; - context.TenantIdOrName = currentUser.TenantId?.ToString(); + return Task.CompletedTask; } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs index a79cccfe66..c6d067044d 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolveContributor.cs @@ -1,9 +1,11 @@ +using System.Threading.Tasks; + namespace Volo.Abp.MultiTenancy { public interface ITenantResolveContributor { string Name { get; } - void Resolve(ITenantResolveContext context); + Task ResolveAsync(ITenantResolveContext context); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs index b9ce83b0b9..7ab0e40366 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/ITenantResolver.cs @@ -1,3 +1,4 @@ +using System.Threading.Tasks; using JetBrains.Annotations; namespace Volo.Abp.MultiTenancy @@ -11,6 +12,6 @@ namespace Volo.Abp.MultiTenancy /// Tenant id, unique name or null (if could not resolve). /// [NotNull] - TenantResolveResult ResolveTenantIdOrName(); + Task ResolveTenantIdOrNameAsync(); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs index a89c44b465..81a9c72042 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantConfigurationProvider.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.MultiTenancy public virtual async Task GetAsync(bool saveResolveResult = false) { - var resolveResult = TenantResolver.ResolveTenantIdOrName(); + var resolveResult = await TenantResolver.ResolveTenantIdOrNameAsync(); if (saveResolveResult) { diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs index 8fcc22059d..f0f65b4c0f 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolveContributorBase.cs @@ -1,10 +1,11 @@ +using System.Threading.Tasks; + namespace Volo.Abp.MultiTenancy { public abstract class TenantResolveContributorBase : ITenantResolveContributor { public abstract string Name { get; } - //TODO: We can make this async - public abstract void Resolve(ITenantResolveContext context); + public abstract Task ResolveAsync(ITenantResolveContext context); } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs index 202ab4c293..5f3a97be2d 100644 --- a/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs +++ b/framework/src/Volo.Abp.MultiTenancy/Volo/Abp/MultiTenancy/TenantResolver.cs @@ -1,6 +1,5 @@ using System; -using System.Linq; -using JetBrains.Annotations; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -18,7 +17,7 @@ namespace Volo.Abp.MultiTenancy _options = options.Value; } - public TenantResolveResult ResolveTenantIdOrName() + public virtual async Task ResolveTenantIdOrNameAsync() { var result = new TenantResolveResult(); @@ -28,7 +27,7 @@ namespace Volo.Abp.MultiTenancy foreach (var tenantResolver in _options.TenantResolvers) { - tenantResolver.Resolve(context); + await tenantResolver.ResolveAsync(context); result.AppliedResolvers.Add(tenantResolver.Name); @@ -43,4 +42,4 @@ namespace Volo.Abp.MultiTenancy return result; } } -} \ No newline at end of file +}