Browse Source

improve culture compatibility checks and handle task exceptions in MvcCachedApplicationConfigurationClient

pull/24838/head
maliming 2 months ago
parent
commit
bf397757a7
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 9
      framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs
  2. 50
      framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient_Tests.cs

9
framework/src/Volo.Abp.AspNetCore.Mvc.Client/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient.cs

@ -8,6 +8,7 @@ using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies;
using Volo.Abp.Caching;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Localization;
using Volo.Abp.Threading;
using Volo.Abp.Users;
@ -107,12 +108,18 @@ public class MvcCachedApplicationConfigurationClient : ICachedApplicationConfigu
ApplicationLocalizationDto localizationDto;
// In most cases, the culture matches and we can reuse the concurrent request.
// If not, we discard it and make a new request with the correct culture.
if (string.Equals(config.Localization.CurrentCulture.Name, cultureName, StringComparison.OrdinalIgnoreCase))
if (CultureHelper.IsCompatibleCulture(config.Localization.CurrentCulture.Name, cultureName))
{
localizationDto = await localizationTask;
}
else
{
// Observe the discarded task to prevent UnobservedTaskException.
_ = localizationTask.ContinueWith(
static t => _ = t.Exception,
TaskContinuationOptions.OnlyOnFaulted
);
localizationDto = await ApplicationLocalizationClientProxy.GetAsync(
new ApplicationLocalizationRequestDto
{

50
framework/test/Volo.Abp.AspNetCore.Mvc.Client.Tests/Volo/Abp/AspNetCore/Mvc/Client/MvcCachedApplicationConfigurationClient_Tests.cs

@ -6,6 +6,7 @@ using NSubstitute;
using Shouldly;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations;
using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies;
using Volo.Abp.Localization;
using Xunit;
namespace Volo.Abp.AspNetCore.Mvc.Client;
@ -36,21 +37,24 @@ public class MvcCachedApplicationConfigurationClient_Tests : AbpAspNetCoreMvcCli
{
var cultureName = "en";
_configProxy.GetAsync(Arg.Any<ApplicationConfigurationRequestOptions>()).Returns(CreateConfigDto(cultureName));
var expectedResources = new Dictionary<string, ApplicationLocalizationResourceDto>
using (CultureHelper.Use(cultureName))
{
["TestResource"] = new()
};
_configProxy.GetAsync(Arg.Any<ApplicationConfigurationRequestOptions>()).Returns(CreateConfigDto(cultureName));
var expectedResources = new Dictionary<string, ApplicationLocalizationResourceDto>
{
["TestResource"] = new()
};
_localizationProxy.GetAsync(Arg.Any<ApplicationLocalizationRequestDto>()).Returns(new ApplicationLocalizationDto { Resources = expectedResources });
_localizationProxy.GetAsync(Arg.Any<ApplicationLocalizationRequestDto>()).Returns(new ApplicationLocalizationDto { Resources = expectedResources });
var result = await _applicationConfigurationClient.GetAsync();
var result = await _applicationConfigurationClient.GetAsync();
result.Localization.Resources.ShouldBe(expectedResources);
result.Localization.Resources.ShouldBe(expectedResources);
await _configProxy.Received(1).GetAsync(Arg.Is<ApplicationConfigurationRequestOptions>(x => x.IncludeLocalizationResources == false));
await _localizationProxy.Received(1).GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == cultureName && x.OnlyDynamics == true));
await _configProxy.Received(1).GetAsync(Arg.Is<ApplicationConfigurationRequestOptions>(x => x.IncludeLocalizationResources == false));
await _localizationProxy.Received(1).GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == cultureName && x.OnlyDynamics == true));
}
}
[Fact]
@ -59,22 +63,26 @@ public class MvcCachedApplicationConfigurationClient_Tests : AbpAspNetCoreMvcCli
var currentCulture = "en";
var serverCulture = "tr";
_configProxy.GetAsync(Arg.Any<ApplicationConfigurationRequestOptions>()).Returns(CreateConfigDto(serverCulture));
var wrongResources = new Dictionary<string, ApplicationLocalizationResourceDto>();
var correctResources = new Dictionary<string, ApplicationLocalizationResourceDto>
using (CultureHelper.Use(currentCulture))
{
["TestResource"] = new()
};
_configProxy.GetAsync(Arg.Any<ApplicationConfigurationRequestOptions>()).Returns(CreateConfigDto(serverCulture));
var wrongResources = new Dictionary<string, ApplicationLocalizationResourceDto>();
var correctResources = new Dictionary<string, ApplicationLocalizationResourceDto>
{
["TestResource"] = new()
};
_localizationProxy.GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == currentCulture)).Returns(new ApplicationLocalizationDto { Resources = wrongResources });
_localizationProxy.GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == serverCulture)).Returns(new ApplicationLocalizationDto { Resources = correctResources });
_localizationProxy.GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == currentCulture)).Returns(new ApplicationLocalizationDto { Resources = wrongResources });
_localizationProxy.GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == serverCulture)).Returns(new ApplicationLocalizationDto { Resources = correctResources });
var result = await _applicationConfigurationClient.GetAsync();
var result = await _applicationConfigurationClient.GetAsync();
result.Localization.Resources.ShouldBe(correctResources);
result.Localization.Resources.ShouldBe(correctResources);
await _localizationProxy.Received(1).GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == serverCulture));
await _localizationProxy.Received(1).GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == currentCulture));
await _localizationProxy.Received(1).GetAsync(Arg.Is<ApplicationLocalizationRequestDto>(x => x.CultureName == serverCulture));
}
}
private static ApplicationConfigurationDto CreateConfigDto(string cultureName)

Loading…
Cancel
Save