ABP ver 9.3.5 with micro-services architecture, the UserFriendlyException not shown on the razor page client when backend API throw a UserFriendlyException, below is the code section:
A BusinessException threw but it cannot shown on the client side in a application service like below:
`
public virtual async Task
if (!result)
{
throw new InvalidVerificationCodeException();
}
var identityUser = await _phoneNumberLoginNewUserCreator.CreateAsync(input.PhoneNumber, input.UserName, input.Password, input.EmailAddress);
return ObjectMapper.Map<IdentityUser, IdentityUserDto>(identityUser);
}
`
the InvalidVerificationCodeException is a BusinessException
I added an UserFriendlyException in the Controller like below:
`
[HttpPost]
[Route("register/by-phone-number")]
public virtual async Task
return result;
}
catch (BusinessException ex)
{
throw new UserFriendlyException(ex.Code);
}
}
`
it got below logs in the backend:
`
2025-10-08 17:38:45.887 +08:00 [WRN] ---------- RemoteServiceErrorInfo ----------
{ "code": null, "message": "EasyAbp.Abp.PhoneNumberLogin:InvalidVerificationCode", "details": null, "data": {}, "validationErrors": null }
2025-10-08 17:38:45.887 +08:00 [WRN] EasyAbp.Abp.PhoneNumberLogin:InvalidVerificationCode Volo.Abp.UserFriendlyException: EasyAbp.Abp.PhoneNumberLogin:InvalidVerificationCode at EasyAbp.Abp.PhoneNumberLogin.Web.Controllers.PhoneNumberLogin.Account.LoginController.RegisterByPhoneNumberAsync(RegisterWithPhoneNumberInput input) at lambda_method3691(Closure, Object) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.
then the client get a 403 forbidden HTTP Status code with the errors like below, it doesn't use UI throw a message:
{ "error": { "code": null, "message": "EasyAbp.Abp.PhoneNumberLogin:InvalidVerificationCode", "details": null, "data": {}, "validationErrors": null } }
2025-09-28 05:01:50.206 +08:00 [FTL] Host terminated unexpectedly! Volo.Abp.AbpInitializationException: An error occurred during the initialize Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor phase of the module Volo.Abp.AuditLogging.AbpAuditLoggingApplicationModule, Volo.Abp.AuditLogging.Application, Version=9.3.4.0, Culture=neutral, PublicKeyToken=null: Unexpected end of expression.. See the inner exception for details. ---> System.FormatException: Unexpected end of expression. at Quartz.CronExpression.BuildExpression(String expression) at Quartz.CronExpression..ctor(String cronExpression) at Quartz.CronExpression.ValidateExpression(String cronExpression) at Quartz.CronScheduleBuilder.CronSchedule(String cronExpression) at Quartz.CronScheduleTriggerBuilderExtensions.WithCronSchedule(TriggerBuilder triggerBuilder, String cronExpression) at Volo.Abp.BackgroundWorkers.Quartz.QuartzPeriodicBackgroundWorkerAdapter1.BuildWorker(IBackgroundWorker worker)
at Volo.Abp.BackgroundWorkers.Quartz.QuartzBackgroundWorkerManager.ReScheduleJobAsync(IBackgroundWorker worker, CancellationToken cancellationToken)
at Volo.Abp.BackgroundWorkers.Quartz.QuartzBackgroundWorkerManager.AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken)
at Volo.Abp.AuditLogging.AbpAuditLoggingApplicationModule.OnApplicationInitializationAsync(ApplicationInitializationContext context)
at Volo.Abp.Modularity.OnApplicationInitializationModuleLifecycleContributor.InitializeAsync(ApplicationInitializationContext context, IAbpModule module)
at Volo.Abp.Modularity.ModuleManager.InitializeModulesAsync(ApplicationInitializationContext context)
--- End of inner exception stack trace ---
at Volo.Abp.Modularity.ModuleManager.InitializeModulesAsync(ApplicationInitializationContext context)
at Volo.Abp.AbpApplicationBase.InitializeModulesAsync()
at Volo.Abp.AbpApplicationWithExternalServiceProvider.InitializeAsync(IServiceProvider serviceProvider)
at Microsoft.AspNetCore.Builder.AbpApplicationBuilderExtensions.InitializeApplicationAsync(IApplicationBuilder app)
at Viewtance.FM.Program.Main(String[] args) in D:\Source\Repos\apps\Viewtance.FM\src\Viewtance.FM.HttpApi.Host\Program.cs:line 58
`any miss configuration for integration service, or the generate proxy action is wrong?
I want to implement some actions (such as given award points to a user daily if the user sign in every day), I need to add an event to OpenIddict server event that it could fire an event handler to implement the logistics, I have followed the article add the event handler and registered in AuthServer project (a micro-services architecture solution), but the event handler not fired and no logs logged, is there any suggestions to debug, or I am using an incorrect way to configure the event handler?
public class DailyPointsHandler : IOpenIddictServerHandler<OpenIddictServerEvents.ProcessSignInContext>//, ITransientDependency
{
public static OpenIddictServerHandlerDescriptor Descriptor { get; }
= OpenIddictServerHandlerDescriptor.CreateBuilder<OpenIddictServerEvents.ProcessSignInContext>()
.UseScopedHandler<DailyPointsHandler>()
.SetOrder(100_000)
.SetType(OpenIddictServerHandlerType.Custom)
.Build();
private readonly IdentityUserManager _userManager;
private readonly IClock _clock;
private readonly ILogger<DailyPointsHandler> _logger;
private readonly IRewardPointsHistoriesAppService _rewardPointsHistoriesAppService;
private readonly IUnitOfWorkManager _unitOfWorkManager;
public DailyPointsHandler(
IdentityUserManager userManager,
IClock clock,
ILogger<DailyPointsHandler> logger,
IRewardPointsHistoriesAppService rewardPointsHistoriesAppService,
IUnitOfWorkManager unitOfWorkManager)
{
_userManager = userManager;
_clock = clock;
_logger = logger;
_rewardPointsHistoriesAppService = rewardPointsHistoriesAppService;
_unitOfWorkManager = unitOfWorkManager;
_logger.LogInformation("DailyPointsHandler constructor initialized");
}
public async ValueTask HandleAsync(OpenIddictServerEvents.ProcessSignInContext context)
{
_logger.LogInformation("进入每日积分处理器");
if (context is null) throw new ArgumentNullException(nameof(context));
// 跳过客户端凭证流程和刷新令牌流程
if (context.Request.IsClientCredentialsGrantType() ||
context.Request.IsRefreshTokenGrantType())
{
_logger.LogInformation("跳过非用户登录流程");
return;
}
// 获取用户ID
var userId = context.Principal?.FindFirst(OpenIddictConstants.Claims.Subject)?.Value;
if (string.IsNullOrEmpty(userId))
{
_logger.LogWarning("无法从声明中获取用户ID");
return;
}
try
{
using var uow = _unitOfWorkManager.Begin(requiresNew: true);
var user = await _userManager.FindByIdAsync(userId);
if (user == null)
{
_logger.LogWarning("用户未找到: {UserId}", userId);
return;
}
if (user != null)
{
var rewardPointsHistoryCreate = new RewardPointsHistoryCreateDto();
rewardPointsHistoryCreate.UserId = user.Id;
rewardPointsHistoryCreate.RewardPointType = RewardPointType.DailySignIn;
await _rewardPointsHistoriesAppService.CreateAsync(rewardPointsHistoryCreate);
await uow.CompleteAsync();
_logger.LogInformation("用户 {UserName} 获得每日登录奖励", user.UserName);
}
}
catch (Exception ex)
{
_logger.LogError(ex, "每日积分赠送处理失败");
// 失败时继续登录流程,不影响认证
}
}
}
registered it at:
private void PreConfigureOpenIddict(IConfiguration configuration, IWebHostEnvironment hostingEnvironment)
{
PreConfigure<OpenIddictBuilder>(builder =>
{
builder.AddValidation(options =>
{
options.AddAudiences("AuthServer");
options.UseLocalServer();
options.UseAspNetCore();
});
builder.AddServer(options =>
{
options.AddEventHandler<ProcessSignInContext>(builder =>
builder.UseInlineHandler(context =>
{
// Attach custom metadata to the configuration document.
//context.Metadata["custom_metadata"] = 42;
context.Logger.LogInformation("Processing sign-in event in inline handler for user {userId}.", context.Principal?.FindFirst(OpenIddictConstants.Claims.Subject)?.Value);
return default;
}));
});
});
PreConfigure<OpenIddictServerBuilder>(serverBuilder =>
{
serverBuilder.AddEventHandler(DailyPointsHandler.Descriptor);
serverBuilder.AddEventHandler(SignOutEventHandler.Descriptor);
serverBuilder.AddEventHandler<ProcessSignInContext>(builder =>
builder.UseInlineHandler(context =>
{
// Attach custom metadata to the configuration document.
//context.Metadata["custom_metadata"] = 42;
context.Logger.LogInformation("Processing sign-in event in inline handler for user {userId}.", context.Principal?.FindFirst(OpenIddictConstants.Claims.Subject)?.Value);
return default;
}));
});
}
Exception message and full stack trace: Navigation menu does not appear on specified language setting
Steps to reproduce the issue:
1 login with an account, back to the web
2 the navigation menus doesn't appear
3 if access the url directly then it will jump to the account login page let you login again
4 if change the language to another one, the navigation appears, if changed the language back the navigation menu disappeared again
5 if waiting for a moments(about 10 minutes around), the navigation menu may be appears
I have tried restart the application and the server, cleared the redis server cache, it cannot resolve it. I have 3 languages configured, english, zh-hant, zh-hans, the issue occurred on zh-hans.
Microsoft.AspNetCore.Authentication.AuthenticationFailureException: An error was encountered while handling the remote login. ---> Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectProtocolException: Message contains error: 'invalid_grant', error_description: 'The specified token is invalid.', error_uri: 'https://documentation.openiddict.com/errors/ID2004'. at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.RedeemAuthorizationCodeAsync(OpenIdConnectMessage tokenEndpointRequest) at Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler.HandleRemoteAuthenticateAsync() --- End of inner exception stack trace --- at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler`1.HandleRequestAsync() at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context) at Prometheus.HttpMetrics.HttpRequestDurationMiddleware.Invoke(HttpContext context) at Prometheus.HttpMetrics.HttpRequestCountMiddleware.Invoke(HttpContext context) at Prometheus.HttpMetrics.HttpInProgressMiddleware.Invoke(HttpContext context) at Volo.Abp.AspNetCore.Security.AbpSecurityHeadersMiddleware.InvokeAsync(HttpContext context, RequestDelegate next) at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.InterfaceMiddlewareBinder.<>c__DisplayClass2_0.<
With Abp 9.2.1, abp suite 9.2.1
2025-07-13 04:57:07.493 +08:00 [INF] 1/10 - EntityGenerateCommand started... 2025-07-13 04:57:07.948 +08:00 [INF] 1/10 - EntityGenerateCommand completed. | Duration: 454 ms. 2025-07-13 04:57:07.948 +08:00 [INF] 2/10 - RepositoryCommand started... 2025-07-13 04:57:08.740 +08:00 [INF] 2/10 - RepositoryCommand completed. | Duration: 791 ms. 2025-07-13 04:57:08.740 +08:00 [INF] 3/10 - ManagerCommand started... 2025-07-13 04:57:08.988 +08:00 [INF] 3/10 - ManagerCommand completed. | Duration: 247 ms. 2025-07-13 04:57:08.988 +08:00 [INF] 4/10 - AppServiceCommand started... 2025-07-13 04:57:13.792 +08:00 [INF] 4/10 - AppServiceCommand completed. | Duration: 4804 ms. 2025-07-13 04:57:13.792 +08:00 [INF] 5/10 - PermissionCommand started... 2025-07-13 04:57:13.849 +08:00 [INF] 5/10 - PermissionCommand completed. | Duration: 56 ms. 2025-07-13 04:57:13.849 +08:00 [INF] 6/10 - ApplicationObjectMappingCommand started... 2025-07-13 04:57:13.878 +08:00 [ERR] ---------- RemoteServiceErrorInfo ---------- { "code": null, "message": "An internal error occurred during your request!", "details": null, "data": null, "validationErrors": null }
2025-07-13 04:57:13.879 +08:00 [ERR] Value cannot be null. (Parameter 'path')
System.ArgumentNullException: Value cannot be null. (Parameter 'path')
at System.ArgumentNullException.Throw(String paramName)
at System.ArgumentNullException.ThrowIfNull(Object argument, String paramName)
at System.ArgumentException.ThrowNullOrEmptyException(String argument, String paramName)
at System.IO.File.ReadAllTextAsync(String path, CancellationToken cancellationToken)
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.ApplicationObjectMappingCommand.IJBgcTmZJf()
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.ApplicationObjectMappingCommand.ExecuteAsync(CrudPageCommandOptions options)
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.CommandManager.ExecuteAllAsync(CrudPageCommandOptions options)
at Volo.Abp.Suite.Areas.AbpSuite.CrudPageGenerator.Commands.CrudPageGenerator.GenerateAsync(EntityModel entity, Solution solution, EntityModel masterEntity, List1 navigationConnections) at Volo.Abp.Suite.Controllers.CrudPageGeneratorController.SaveAndGenerateEntityAsync(Guid solutionId, EntityModel entity) at lambda_method2003(Closure, Object) at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfActionResultExecutor.Execute(ActionContext actionContext, IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments) at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Awaited|12_0(ControllerActionInvoker invoker, ValueTask1 actionResultValueTask)
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>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextExceptionFilterAsync>g__Awaited|26_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
2025-07-13 04:57:13.884 +08:00 [INF] Executing ObjectResult, writing value of type 'Volo.Abp.Http.RemoteServiceErrorResponse'.
2025-07-13 04:57:13.885 +08:00 [INF] Executed action Volo.Abp.Suite.Controllers.CrudPageGeneratorController.SaveAndGenerateEntityAsync (Volo.Abp.Suite) in 62760.4142ms
2025-07-13 04:57:13.885 +08:00 [INF] Executed endpoint 'Volo.Abp.Suite.Controllers.CrudPageGeneratorController.SaveAndGenerateEntityAsync (Volo.Abp.Suite)'
2025-07-13 04:57:13.885 +08:00 [INF] Request finished HTTP/1.1 POST http://localhost:3000/api/abpSuite/crudPageGenerator/6f93a03f-284a-4842-ae53-00aec0831ca6/save-and-generate-entity - 500 null application/json; charset=utf-8 62761.8723ms
I have tried restart the application and the server, cleared the redis server cache, it cannot resolve it. I have 3 languages configured, english, zh-hant, zh-hans, the issue occurred on zh-hans.