- Template: microservice
- Created ABP Studio Version: 1.3.2
- Current ABP Studio Version: 2.2.4
- Multi-Tenancy: Yes
- UI Framework: mvc
- Theme: leptonx
- Theme Style: system
- Theme Menu Placement: side
- Database Provider: ef
- Database Management System: postgresql
- Mobile Framework: react-native
- Public Website: Yes
- Social Login: Yes
- Include Tests: Yes
- Dynamic Localization: Yes
- Kubernetes Configuration: Yes
- Grafana Dashboard: Yes
- Use Local References: No
- Aspire: Yes
- Optional Modules:
- GDPR
- FileManagement
- TextTemplateManagement
- AuditLogging
- Chat
- OpenIddictAdmin
- Selected Languages: English, Arabic, Chinese (Simplified), Chinese (Traditional), Czech, English (United Kingdom), Finnish, French, German (Germany), Hindi , Hungarian, Icelandic, Italian, Portuguese (Brazil), Romanian (Romania), Russian, Slovak, Spanish, Swedish, Turkish
- Default Language: English
- Create Command: abp new TavTechnologies.Treva -t microservice --ui-framework mvc --mobile react-native --database-provider ef --database-management-system postgresql --theme leptonx --skip-migrator --public-website --dont-run-bundling -no-language-management -chat -file-management
Dear Abp,
We have problems on microk8s after upgrade to dotnet 10.
Because of some reason PublicWeb and Web projects in microservice solution sends a request without CultureName and microservices gives error there fore PublicWeb and Web can't start properly.
The given error is like that
[21:48:41 INF] Starting TavTechnologies.Treva.Web.Public [21:48:44 INF] Initialized all ABP modules. [21:48:44 INF] Initializing UI Database [21:48:45 INF] Saving healthchecks configuration to database [21:48:45 WRN] Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://+:8080'. [21:48:45 INF] Now listening on: http://[::]:8080 [21:48:45 INF] Start processing HTTP request GET http://localhost:8080/health-status [21:48:45 INF] Sending HTTP request GET http://localhost:8080/health-status [21:48:45 INF] Application started. Press Ctrl+C to shut down. [21:48:45 INF] Hosting environment: Staging [21:48:45 INF] Content root path: /app [21:48:45 INF] Request starting HTTP/1.1 GET http://localhost:8080/health-status - null null [21:48:46 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [21:48:46 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [21:48:46 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [21:48:46 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [21:48:46 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [21:48:46 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [21:48:46 INF] Received HTTP response headers after 23.2122ms - 400 [21:48:46 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '400', Handled: 'False', Attempt: '0', Execution Time: 35.827ms [21:48:46 INF] End processing HTTP request after 60.8145ms - 400 [21:48:46 INF] Received HTTP response headers after 226.2825ms - 200 [21:48:46 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '200', Handled: 'False', Attempt: '0', Execution Time: 235.9117ms [21:48:46 INF] End processing HTTP request after 236.9095ms - 200 [21:48:46 ERR] Connection id "0HNKH06EQOCQC", Request id "0HNKH06EQOCQC:00000001": An unhandled exception was thrown by the application. Volo.Abp.Http.Client.AbpRemoteCallException: Your request is not valid! at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase`1.ThrowExceptionForResponseAsync(HttpResponseMessage response) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase`1.RequestAsync(ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase`1.RequestAsync[T](ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase`1.RequestAsync[T](String methodName, ClientProxyRequestTypeValue arguments) at Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies.AbpApplicationLocalizationClientProxy.GetAsync(ApplicationLocalizationRequestDto input) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetRemoteConfigurationAsync() at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.<GetAsync>b__23_0() at Volo.Abp.Caching.DistributedCache`2.GetOrAddAsync(TCacheKey key, Func`1 factory, Func`1 optionsFactory, Nullable`1 hideErrors, Boolean considerUow, CancellationToken token) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetAsync() at Volo.Abp.AspNetCore.Mvc.Client.RemoteLanguageProvider.GetLanguagesAsync() at Microsoft.AspNetCore.RequestLocalization.DefaultAbpRequestLocalizationOptionsProvider.GetLocalizationOptionsAsync() at Microsoft.AspNetCore.RequestLocalization.AbpRequestLocalizationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next) at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext() --- End of stack trace from previous location --- at Volo.Abp.AspNetCore.Mvc.Libs.AbpMvcLibsService.<CheckLibs>b__1_0(HttpContext httpContext, RequestDelegate next) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application) [21:48:46 INF] Received HTTP response headers after 546.9353ms - 500 [21:48:46 INF] Request finished HTTP/1.1 GET https://localhost:8080/health-status - 500 0 null 502.2009ms [21:48:46 WRN] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500', Handled: 'True', Attempt: '0', Execution Time: 571.0535ms [21:48:46 WRN] Resilience event occurred. EventName: 'OnRetry', Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500'
[23:33:37 INF] Starting TavTechnologies.Treva.AdministrationService [23:33:40 INF] Trying to acquire the distributed lock for database migration: AdministrationService. [23:33:40 INF] Distributed lock is acquired for database migration: AdministrationService... Cannot load library libgssapi_krb5.so.2 Error: libgssapi_krb5.so.2: cannot open shared object file: No such file or directory [23:33:41 INF] Seeding admin permissions. [23:33:43 INF] Distributed lock has been released for database migration: AdministrationService... [23:33:43 INF] Trying to acquire the distributed lock for database migration: AbpBlobStoring. [23:33:43 INF] Distributed lock is acquired for database migration: AbpBlobStoring... [23:33:43 INF] Distributed lock has been released for database migration: AbpBlobStoring... [23:33:44 INF] Saving external localizations... [23:33:44 INF] Initialized all ABP modules. [23:33:44 INF] Completed to save external localizations. [23:33:44 WRN] Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://+:8080'. [23:33:45 INF] Now listening on: http://[::]:8080 [23:33:45 INF] Application started. Press Ctrl+C to shut down. [23:33:45 INF] Hosting environment: Staging [23:33:45 INF] Content root path: /app [23:33:47 INF] Request starting HTTP/1.1 GET http://treva-administration/api/abp/application-configuration?IncludeLocalizationResources=False&api-version=1.0 - null null [23:33:47 INF] Request starting HTTP/1.1 GET http://treva-administration/api/abp/application-localization?CultureName=&OnlyDynamics=True&api-version=1.0 - null null [23:33:48 INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController.GetAsync (Volo.Abp.AspNetCore.Mvc)' [23:33:48 INF] Executing endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc)' [23:33:48 INF] Route matched with {area = "abp", action = "Get", controller = "AbpApplicationLocalization", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationDto] GetAsync(Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationLocalizationRequestDto) on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController (Volo.Abp.AspNetCore.Mvc). [23:33:48 INF] Route matched with {area = "abp", action = "Get", controller = "AbpApplicationConfiguration", page = ""}. Executing controller action with signature System.Threading.Tasks.Task`1[Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationDto] GetAsync(Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ApplicationConfigurationRequestOptions) on controller Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController (Volo.Abp.AspNetCore.Mvc). [23:33:48 INF] Executing action method Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationConfigurationController.GetAsync (Volo.Abp.AspNetCore.Mvc) - Validation state: Valid [23:33:48 WRN] The cookie 'XSRF-TOKEN' has set 'SameSite=None' and must also set 'Secure'. [23:33:48 WRN] ---------- RemoteServiceErrorInfo ---------- { "code": null, "message": "Your request is not valid!", "details": "The following errors were detected during validation.\n - The CultureName field is required.\n", "data": null, "validationErrors": [ { "message": "The CultureName field is required.", "members": [ "cultureName" ] } ] } [23:33:48 WRN] ModelState is not valid! See ValidationErrors for details. Volo.Abp.Validation.AbpValidationException: ModelState is not valid! See ValidationErrors for details. at Volo.Abp.AspNetCore.Mvc.Validation.ModelStateValidator.Validate(ModelStateDictionary modelState) at Volo.Abp.AspNetCore.Mvc.Validation.AbpValidationActionFilter.OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() --- End of stack trace from previous location --- at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted) [23:33:48 WRN] There are 1 validation errors: The CultureName field is required. (CultureName) [23:33:48 INF] Executing ObjectResult, writing value of type 'Volo.Abp.Http.RemoteServiceErrorResponse'. [23:33:48 INF] Executed action Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController.GetAsync (Volo.Abp.AspNetCore.Mvc) in 172.5808ms [23:33:48 INF] Executed endpoint 'Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.AbpApplicationLocalizationController.GetAsync (Volo.Abp.AspNetCore.Mvc)'
10 Answer(s)
-
0
/api/abp/application-localizationrequires thecultureNamequerystring parameter. If it’s missing (or empty), ABP validates the DTO and returns 400 with: “The CultureName field is required.” (exactly what your AdministrationService log shows:CultureName=).- In ABP MVC microservice solutions,
PublicWeb/Webfetches localization at startup viaMvcCachedApplicationConfigurationClient→AbpApplicationLocalizationClientProxy.GetAsync(...). In your environment, the request ends up asCultureName=(empty), so the UI app fails to boot.
Apply one of the following definitive fixes (the first is the recommended one):
1) Ensure the gateway forwards the culture to downstream services (recommended)
In Kubernetes / ingress / reverse-proxy setups, the request culture is typically resolved from one of these:
Accept-Languageheader- ABP culture cookie (set by the UI)
- Query string (
cultureName,ui-culture, etc.)
Your log shows the UI is calling the gateway with
...?*and the downstream call becomesCultureName=. That strongly indicates the culture information is not being forwarded/preserved by the gateway/proxy layer.Fix: configure the gateway/ingress so it does not drop the
Accept-Languageheader and does not strip query strings. Concretely:- Preserve
Accept-Languageend-to-end. - Ensure the full query string is forwarded as-is (some proxies can be misconfigured to drop/normalize it).
After that, ABP will be able to resolve culture and will call:
/api/abp/application-localization?cultureName=en...instead ofCultureName=.2) Force a default culture for the UI apps (defensive)
As a fallback, configure a default request culture for the MVC UI so it never ends up sending an empty culture to the backend.
In your
PublicWebandWebmodule (the module that configures localization), set a default culture (exampleen):using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Localization; using System.Globalization; using Volo.Abp.Modularity; public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.Configure<RequestLocalizationOptions>(options => { var defaultCulture = new CultureInfo("en"); options.DefaultRequestCulture = new RequestCulture(defaultCulture); options.SupportedCultures ??= new List<CultureInfo>(); options.SupportedUICultures ??= new List<CultureInfo>(); if (!options.SupportedCultures.Any(c => c.Name == "en")) options.SupportedCultures.Add(defaultCulture); if (!options.SupportedUICultures.Any(c => c.Name == "en")) options.SupportedUICultures.Add(defaultCulture); }); }This prevents
CultureNamefrom being empty even when upstream culture detection fails.3) As a last resort: customize the application-localization endpoint validation (not recommended)
You can alter validation behavior, but this changes ABP’s standard API contract and is not recommended compared to fixing culture forwarding/default culture.
(Also note) the warning
Could not find IdentityClientConfiguration for AbpMvcClientis a separate configuration issue (identity client config), not the cause of theCultureNamevalidation error.- https://abp.io/docs/10.2/framework/api-development/standard-apis/localization
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
I made all of them but no change
[13:23:15 INF] Starting TavTechnologies.Treva.Web.Public [13:23:18 INF] Initialized all ABP modules. [13:23:19 INF] Initializing UI Database [13:23:20 INF] Saving healthchecks configuration to database [13:23:20 WRN] Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://+:8080'. [13:23:20 INF] Now listening on: http://[::]:8080 [13:23:20 INF] Start processing HTTP request GET http://localhost:8080/health-status [13:23:20 INF] Sending HTTP request GET http://localhost:8080/health-status [13:23:20 INF] Application started. Press Ctrl+C to shut down. [13:23:20 INF] Hosting environment: Staging [13:23:20 INF] Content root path: /app [13:23:20 INF] Request starting HTTP/1.1 GET http://localhost:8080/health-status - null null [13:23:20 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [13:23:20 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [13:23:20 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [13:23:20 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [13:23:20 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [13:23:20 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [13:23:21 INF] Received HTTP response headers after 37.0391ms - 400 [13:23:21 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '400', Handled: 'False', Attempt: '0', Execution Time: 48.0712ms [13:23:21 INF] End processing HTTP request after 62.7315ms - 400 [13:23:21 INF] Received HTTP response headers after 254.533ms - 200 [13:23:21 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '200', Handled: 'False', Attempt: '0', Execution Time: 262.2115ms [13:23:21 INF] End processing HTTP request after 263.1122ms - 200 [13:23:21 ERR] Connection id "0HNKHGGMCU4UQ", Request id "0HNKHGGMCU4UQ:00000001": An unhandled exception was thrown by the application. Volo.Abp.Http.Client.AbpRemoteCallException: Your request is not valid! at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase
1.ThrowExceptionForResponseAsync(HttpResponseMessage response) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync(ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](String methodName, ClientProxyRequestTypeValue arguments) at Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies.AbpApplicationLocalizationClientProxy.GetAsync(ApplicationLocalizationRequestDto input) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetRemoteConfigurationAsync() at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.<GetAsync>b__23_0() at Volo.Abp.Caching.DistributedCache2.GetOrAddAsync(TCacheKey key, Func1 factory, Func1 optionsFactory, Nullable1 hideErrors, Boolean considerUow, CancellationToken token) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetAsync() at Volo.Abp.AspNetCore.Mvc.Client.RemoteLanguageProvider.GetLanguagesAsync() at Microsoft.AspNetCore.RequestLocalization.DefaultAbpRequestLocalizationOptionsProvider.GetLocalizationOptionsAsync() at Microsoft.AspNetCore.RequestLocalization.AbpRequestLocalizationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next) at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext() --- End of stack trace from previous location --- at Volo.Abp.AspNetCore.Mvc.Libs.AbpMvcLibsService.<CheckLibs>b__1_0(HttpContext httpContext, RequestDelegate next) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application) [13:23:21 INF] Request finished HTTP/1.1 GET https://localhost:8080/health-status - 500 0 null 614.8221ms [13:23:21 INF] Received HTTP response headers after 682.6244ms - 500 [13:23:21 WRN] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500', Handled: 'True', Attempt: '0', Execution Time: 706.7309ms [13:23:21 WRN] Resilience event occurred. EventName: 'OnRetry', Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500'Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
The key detail in your new log is this:
GET http://treva-publicgateway/api/abp/application-localization?*That means the MVC UI is calling the endpoint without
cultureNameat all (not even empty). ABP’s/api/abp/application-localizationendpoint requirescultureName, so the gateway correctly returns 400, and the UI crashes while building request localization options.Since you already tried proxy/header/default culture ideas and nothing changed, the most reliable fix is to force the MVC UI to always include
cultureNamewhen requesting application-localization by overriding the client that makes that call.Solution (override the MVC cached application configuration client)
In both
TavTechnologies.Treva.WebandTavTechnologies.Treva.Web.Public:- Create a custom implementation:
using System.Globalization; using System.Threading.Tasks; using Volo.Abp.AspNetCore.Mvc.Client; using Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations; using Volo.Abp.DependencyInjection; public class FixedMvcCachedApplicationConfigurationClient : MvcCachedApplicationConfigurationClient, ITransientDependency { private readonly IAbpApplicationLocalizationAppService _localizationAppService; public FixedMvcCachedApplicationConfigurationClient( IAbpApplicationConfigurationAppService applicationConfigurationAppService, IAbpApplicationLocalizationAppService localizationAppService) : base(applicationConfigurationAppService, localizationAppService) { _localizationAppService = localizationAppService; } protected override Task<ApplicationLocalizationDto> GetLocalizationAsync() { // Ensure cultureName is never missing var cultureName = CultureInfo.CurrentUICulture?.Name; if (string.IsNullOrWhiteSpace(cultureName)) { cultureName = "en"; } return _localizationAppService.GetAsync(new ApplicationLocalizationRequestDto { CultureName = cultureName, OnlyDynamics = true }); } }- Replace the default service registration in your web module:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Volo.Abp.AspNetCore.Mvc.Client; public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.Replace(ServiceDescriptor.Transient< MvcCachedApplicationConfigurationClient, FixedMvcCachedApplicationConfigurationClient>()); }This guarantees the call becomes:
/api/abp/application-localization?cultureName=en...and avoids the startup crash even if something in your environment is preventing ABP from determining culture normally.
Why this works
Your logs prove the request is being made without
cultureName. The ABP endpoint requires it, and returns 400 when it’s missing. By forcing the client to always send a non-empty culture, you bypass the failing path and your UI can start.Verified reference
/api/abp/application-localizationrequirescultureName: https://abp.io/docs/10.2/framework/api-development/standard-apis/localization
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
It's still same.
[14:05:52 INF] Starting TavTechnologies.Treva.Web.Public [14:05:55 INF] Initialized all ABP modules. [14:05:55 INF] Initializing UI Database [14:05:56 INF] Saving healthchecks configuration to database [14:05:56 WRN] Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://+:8080'. [14:05:56 INF] Now listening on: http://[::]:8080 [14:05:56 INF] Start processing HTTP request GET http://localhost:8080/health-status [14:05:56 INF] Sending HTTP request GET http://localhost:8080/health-status [14:05:56 INF] Application started. Press Ctrl+C to shut down. [14:05:56 INF] Hosting environment: Staging [14:05:56 INF] Content root path: /app [14:05:56 INF] Request starting HTTP/1.1 GET http://localhost:8080/health-status - null null [14:05:57 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [14:05:57 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [14:05:57 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [14:05:57 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [14:05:57 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [14:05:57 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [14:05:57 INF] Received HTTP response headers after 53.4503ms - 400 [14:05:57 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '400', Handled: 'False', Attempt: '0', Execution Time: 74.4164ms [14:05:57 INF] End processing HTTP request after 90.7847ms - 400 [14:05:57 INF] Received HTTP response headers after 207.9792ms - 200 [14:05:57 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '200', Handled: 'False', Attempt: '0', Execution Time: 216.7316ms [14:05:57 INF] End processing HTTP request after 217.9695ms - 200 [14:05:57 ERR] Connection id "0HNKHH8G7FMKA", Request id "0HNKHH8G7FMKA:00000001": An unhandled exception was thrown by the application. Volo.Abp.Http.Client.AbpRemoteCallException: Your request is not valid! at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase
1.ThrowExceptionForResponseAsync(HttpResponseMessage response) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync(ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](String methodName, ClientProxyRequestTypeValue arguments) at Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies.AbpApplicationLocalizationClientProxy.GetAsync(ApplicationLocalizationRequestDto input) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetRemoteConfigurationAsync() at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.<GetAsync>b__23_0() at Volo.Abp.Caching.DistributedCache2.GetOrAddAsync(TCacheKey key, Func1 factory, Func1 optionsFactory, Nullable1 hideErrors, Boolean considerUow, CancellationToken token) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetAsync() at Volo.Abp.AspNetCore.Mvc.Client.RemoteLanguageProvider.GetLanguagesAsync() at Microsoft.AspNetCore.RequestLocalization.DefaultAbpRequestLocalizationOptionsProvider.GetLocalizationOptionsAsync() at Microsoft.AspNetCore.RequestLocalization.AbpRequestLocalizationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next) at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext() --- End of stack trace from previous location --- at Volo.Abp.AspNetCore.Mvc.Libs.AbpMvcLibsService.<CheckLibs>b__1_0(HttpContext httpContext, RequestDelegate next) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application) [14:05:57 INF] Received HTTP response headers after 560.7824ms - 500 [14:05:57 WRN] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500', Handled: 'True', Attempt: '0', Execution Time: 584.7674ms [14:05:57 INF] Request finished HTTP/1.1 GET https://localhost:8080/health-status - 500 0 null 517.9328ms [14:05:57 WRN] Resilience event occurred. EventName: 'OnRetry', Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500' [14:05:58 INF] Sending HTTP request GET http://localhost:8080/health-status [14:05:58 INF] Request starting HTTP/1.1 GET http://localhost:8080/health-status - null nullMarkdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
Your log still shows the MVC UI is calling:
GET http://treva-publicgateway/api/abp/application-localization?*So the UI-side override you added is not being used at all (otherwise you would see
cultureName=...on the outgoing request).The most definitive way to fix this without relying on the UI client pipeline is to make the gateway always supply a default
cultureNamewhen it proxies/api/abp/application-localization.Solution
In PublicWebGateway (YARP-based gateway), add a transform for the
/api/abp/application-localizationroute so that ifcultureNameis missing, it is added.Example (in the gateway module
ConfigureServices):using Microsoft.Extensions.DependencyInjection; using System; public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddReverseProxy() .AddTransforms(builderContext => { // Apply only for the app-localization endpoint if (builderContext.Route?.Match?.Path != null && builderContext.Route.Match.Path.Contains("/api/abp/application-localization", StringComparison.OrdinalIgnoreCase)) { builderContext.AddRequestTransform(transformContext => { var query = transformContext.HttpContext.Request.Query; // If cultureName is missing or empty, force a default if (!query.ContainsKey("cultureName") || string.IsNullOrWhiteSpace(query["cultureName"])) { var original = transformContext.ProxyRequest.RequestUri; // Append required query string parameters var separator = string.IsNullOrEmpty(original!.Query) ? "?" : "&"; var newUri = new Uri(original.ToString() + $"{separator}cultureName=en&onlyDynamics=true"); transformContext.ProxyRequest.RequestUri = newUri; } return ValueTask.CompletedTask; }); } }); }This guarantees the downstream service receives a valid request like:
/api/abp/application-localization?cultureName=en&onlyDynamics=trueand prevents the startup crash.Why this is the correct next step
- Your logs prove the request reaches the gateway without
cultureName. - Even after UI-side changes, the outgoing request is still
?*, meaning the UI override isn’t actually active (wrong service replaced, wrong project/module, or not loaded). - The gateway transform is the last “central” place where you can unconditionally enforce the required parameter for all callers.
Reference (requirement)
cultureNameis required for/api/abp/application-localization:- https://abp.io/docs/10.2/framework/api-development/standard-apis/localization
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) - Your logs prove the request reaches the gateway without
-
0
[14:23:25 INF] Starting TavTechnologies.Treva.Web.Public [14:23:28 INF] Initialized all ABP modules. [14:23:28 INF] Initializing UI Database [14:23:29 INF] Saving healthchecks configuration to database [14:23:29 WRN] Overriding HTTP_PORTS '8080' and HTTPS_PORTS ''. Binding to values defined by URLS instead 'http://+:8080'. [14:23:30 INF] Now listening on: http://[::]:8080 [14:23:30 INF] Start processing HTTP request GET http://localhost:8080/health-status [14:23:30 INF] Sending HTTP request GET http://localhost:8080/health-status [14:23:30 INF] Application started. Press Ctrl+C to shut down. [14:23:30 INF] Hosting environment: Staging [14:23:30 INF] Content root path: /app [14:23:30 INF] Request starting HTTP/1.1 GET http://localhost:8080/health-status - null null [14:23:30 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [14:23:30 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [14:23:30 WRN] Could not find IdentityClientConfiguration for AbpMvcClient. Either define a configuration for AbpMvcClient or set a default configuration. [14:23:30 INF] Start processing HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [14:23:30 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-localization?* [14:23:30 INF] Sending HTTP request GET http://treva-publicgateway/api/abp/application-configuration?* [14:23:30 INF] Received HTTP response headers after 34.7119ms - 400 [14:23:30 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '400', Handled: 'False', Attempt: '0', Execution Time: 51.7668ms [14:23:30 INF] End processing HTTP request after 71.8322ms - 400 [14:23:30 INF] Received HTTP response headers after 213.0176ms - 200 [14:23:30 INF] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '200', Handled: 'False', Attempt: '0', Execution Time: 225.3904ms [14:23:30 INF] End processing HTTP request after 226.0725ms - 200 [14:23:30 ERR] Connection id "0HNKHHIA57VBB", Request id "0HNKHHIA57VBB:00000001": An unhandled exception was thrown by the application. Volo.Abp.Http.Client.AbpRemoteCallException: Your request is not valid! at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase
1.ThrowExceptionForResponseAsync(HttpResponseMessage response) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync(ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](ClientProxyRequestContext requestContext) at Volo.Abp.Http.Client.ClientProxying.ClientProxyBase1.RequestAsync[T](String methodName, ClientProxyRequestTypeValue arguments) at Volo.Abp.AspNetCore.Mvc.ApplicationConfigurations.ClientProxies.AbpApplicationLocalizationClientProxy.GetAsync(ApplicationLocalizationRequestDto input) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetRemoteConfigurationAsync() at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.<GetAsync>b__23_0() at Volo.Abp.Caching.DistributedCache2.GetOrAddAsync(TCacheKey key, Func1 factory, Func1 optionsFactory, Nullable1 hideErrors, Boolean considerUow, CancellationToken token) at Volo.Abp.AspNetCore.Mvc.Client.MvcCachedApplicationConfigurationClient.GetAsync() at Volo.Abp.AspNetCore.Mvc.Client.RemoteLanguageProvider.GetLanguagesAsync() at Microsoft.AspNetCore.RequestLocalization.DefaultAbpRequestLocalizationOptionsProvider.GetLocalizationOptionsAsync() at Microsoft.AspNetCore.RequestLocalization.AbpRequestLocalizationMiddleware.InvokeAsync(HttpContext context, RequestDelegate next) at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<<CreateMiddleware>b__0>d.MoveNext() --- End of stack trace from previous location --- at Volo.Abp.AspNetCore.Mvc.Libs.AbpMvcLibsService.<CheckLibs>b__1_0(HttpContext httpContext, RequestDelegate next) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application) [14:23:30 INF] Received HTTP response headers after 541.9326ms - 500 [14:23:30 INF] Request finished HTTP/1.1 GET https://localhost:8080/health-status - 500 0 null 476.7667ms [14:23:30 WRN] Execution attempt. Source: '-standard//Standard-Retry', Operation Key: 'null', Result: '500', Handled: 'True', Attempt: '0', Execution Time: 585.612msMarkdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
The
?*you see in the client log is just ABP’s log formatting (it hides the query details). The real proof is on the target service side: earlier you already captured a request arriving as:/api/abp/application-localization?CultureName=&OnlyDynamics=True&api-version=1.0So the query parameter exists but ends up empty (
CultureName=). That usually happens when the UI app can’t determine the current culture at startup inside the container, so it passes an empty string to the application-localization call.The most reliable, ABP-consistent fix is: set the default culture explicitly in the UI apps and ensure ABP uses it.
1) Hard-set DefaultThreadCurrentCulture + DefaultThreadCurrentUICulture at startup (PublicWeb + Web)
In
Program.csof TavTechnologies.Treva.Web.Public and TavTechnologies.Treva.Web (beforeapp.InitializeApplicationAsync()), add:using System.Globalization; CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("en"); CultureInfo.DefaultThreadCurrentUICulture = new CultureInfo("en");This guarantees
CultureInfo.CurrentUICulture.Nameis never empty in the process (container) even before the first HTTP request is fully processed.2) Also set ABP RequestLocalization default culture (defensive)
Keep/configure
RequestLocalizationOptionsas well (module ConfigureServices):context.Services.Configure<RequestLocalizationOptions>(options => { options.SetDefaultCulture("en"); });3) Make sure Linux globalization isn’t running in invariant mode
When .NET runs with invariant globalization, cultures can behave unexpectedly. In your PublicWeb/Web container, ensure this env var is not true:
DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false
(If it’s missing, that’s fine; just don’t set it to
true.)Why this fixes your specific symptom
ABP’s application-localization endpoint requires
cultureName(validated by ABP and documented). Your backend logs showedCultureName=. The only way that happens is: the caller (MVC UI) is constructing the request with an empty culture value. For containerized deployments, explicitly settingDefaultThreadCurrentUICultureis the most deterministic way to prevent an empty culture during early startup.Reference
- https://abp.io/docs/10.2/framework/api-development/standard-apis/localization
This response was generated by AI. If it didn’t solve your problem, feel free to post a new answer — our support team will jump in to help you soon.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post) -
0
Hi maliming,
I removed Abp Studio, Suite and Cli completely and delete related folders from user path.
Also removed nuget packages and history.
Reinstalled from scratch and create a new solution and then updated the new solution to Abp 10.2.0 than 10.2.0 suite template files came.
Thank you.
Have a great day.
Markdown supported.Copy, paste, or drag & drop images and files (max 100 MB per file, 100 MB total per post)