After your ABP Commercial license expires, you can continue to use and deploy your existing ABP-based solutions without interruption. The license is perpetual for the versions and modules you obtained during your active license period. There are no restrictions on running or deploying applications built while your license was valid.
Once the license expires, you will lose access to future framework updates, bug fixes, and hotfixes. You will only be able to use the versions released before your license expiration.
You will retain access to the commercial source code and binaries that you downloaded or used during your valid license period. However, you will not be able to download new versions or updates after expiration.
Technical support and issue resolution from the ABP team will not be available after your license expires. Access to premium support is only available to active license holders.
Renewing your license now ensures uninterrupted access to updates, new features, bug fixes, and technical support. Early renewal may also help you avoid potential price increases or changes in licensing terms. For current incentives or pricing benefits, please refer to the official pricing page or contact the ABP sales team directly.
Sources:
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.
ABP-LIC-0013 - License exception: ABP-LIC-0023: An error occured while calling the license server! Unterminated string. Expected delimiter: ". Path 'ControlCode'
indicates that the license server response is malformed, likely due to an invalid or corrupted AbpLicenseCode
value in your configuration.To resolve this issue:
Check the AbpLicenseCode
Value
AbpLicenseCode
in your appsettings.json
(or environment variable) is a valid, unmodified license string. It should be a single line, without extra spaces, line breaks, or missing/extra characters.Re-obtain the License Code
Check for Hidden Characters
Restart the Application
Check for Multiple License Codes
AbpLicenseCode
entry in your configuration files and environment variables to avoid conflicts.Network Issues
If the problem persists after these steps, contact ABP Commercial support with your license code and error details.
Sources:
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.
When you add a new microservice and generate entities with ABP Suite, the permissions are registered in the database, but if the new permission group does not appear in the web UI for role assignment, it is usually due to one of the following reasons in a microservice solution:
Application Contracts Reference Missing:
The new microservice's Application.Contracts project must be referenced by the IdentityService (or the service responsible for permission management). This is required so that the permissions are registered and exposed to the permission management UI. If the reference is missing, the permission definitions will not be loaded into the permission management system.
Rebuild and Restart All Services:
After adding a new microservice and updating references, you must rebuild the entire solution and restart all related services (especially the IdentityService and AdministrationService). This ensures that the new permissions are discovered and loaded.
Permission Provider Registration:
Ensure that your new microservice's PermissionDefinitionProvider
is properly implemented and included in the Application.Contracts project. The provider should define the permission group and permissions.
Database Migration:
Make sure you have applied the latest database migrations for the new microservice and the Administration database.
Cache Issues:
Clear the distributed cache (e.g., Redis) after making changes to permissions, as permission definitions are cached.
Checklist to resolve:
IdentityService.Application.Contracts
to your new microservice's Application.Contracts
.PermissionDefinitionProvider
is present and correct.This approach aligns with common ABP microservice conventions for permission management.
No verified source available for this specific query.
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.
The error occurs because Hangfire requires its storage (JobStorage) to be initialized before any Hangfire API is used. When you add Hangfire dependencies and initialization code to your DbMigrator project, but do not configure Hangfire storage (via AddHangfire
), it throws this exception.
The recommended approach is: Do not add Hangfire modules or initialization code to your DbMigrator project. The DbMigrator's purpose is to run database migrations and seed data, not to execute background jobs. Hangfire should only be configured in your main web host (or background worker) projects where background jobs are actually processed.
If you need to keep Hangfire NuGet packages for dependency reasons, ensure you do NOT call AddHangfire
or add the Hangfire module in your DbMigrator. Remove any [DependsOn(typeof(AbpBackgroundJobsHangfireModule))]
or similar from your DbMigrator module.
If you must share code between projects, use a shared library for job definitions, but keep Hangfire configuration and module dependencies out of the DbMigrator.
This is a common and recommended separation in ABP solutions:
You do not need to uninstall Hangfire from your solution—just ensure the DbMigrator project does not depend on or initialize Hangfire.
Sources:
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.
To limit the number of customers (tenants) and users that your customer can create in an ABP multi-tenant application, you can use the built-in multi-tenancy and SaaS infrastructure. ABP provides mechanisms to control tenant resources, such as limiting the number of users or other resources per tenant, typically through the use of Editions and Features.
You can define custom features (e.g., "MaxUserCount", "MaxCustomerCount") and assign them to Editions. Then, assign Editions to your tenants. In your business logic, you can check these feature values to enforce the limits when creating new users or customers.
There is no direct UI in the Angular management interface for setting these limits out-of-the-box, but the infrastructure is available for you to implement this logic using features and editions.
Example steps:
Example code for checking a feature value:
var maxUserCount = await FeatureChecker.GetAsync<int>("MaxUserCount");
if (currentUserCount >= maxUserCount)
{
throw new BusinessException("User limit reached for this tenant.");
}
For more details, see the official documentation on limiting tenant resources.
Sources:
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.
The error "IDX10223: Lifetime validation failed. The token is expired." indicates that the JWT access token used by your Hangfire job is expired at the time of execution. This is a common issue when background jobs are scheduled to run after the token's expiration, especially in distributed or tiered ABP applications.
To resolve this, you should ensure that your Hangfire jobs acquire a fresh access token before making authorized API calls. Do not cache or reuse tokens for long-running or recurring jobs.
In microservice or tiered ABP setups, the recommended approach is to use the client credentials flow to programmatically request a new token for each job execution. This ensures the token is always valid.
If you are using ABP's built-in remote service proxies, configure them to use the client credentials flow and set up the necessary client in your IdentityServer/OpenIddict configuration.
Avoid using user tokens for background jobs, as they will expire and cannot be refreshed without user interaction.
If you are using distributed cache for tokens, ensure the cache expiration is not longer than the token's lifetime.
This approach aligns with common ABP conventions, but specific official documentation for this exact scenario is not available.
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.
To achieve a true Blazor WebAssembly (WASM) solution in ABP—where the client is a standalone WASM project (not hosted inside the ASP.NET Core project)—and to enable hot reload and "Edit and Continue" for faster development, you should use the "Layered Solution" template with the Blazor WebAssembly option. This separates the Blazor client and server, allowing you to run and debug the client project independently.
abp new MyProject -t app -u blazor-wasm
MyProject.Blazor
(Blazor host project)MyProject.Blazor.Client
(Blazor WASM client)MyProject.HttpApi.Host
(API backend)Project Structure:
*.Blazor.Client
project is a pure WASM app. You can run and debug it directly, enabling hot reload and "Edit and Continue".*.Blazor
project is the host (optional for deployment, not needed for local development).Development Workflow:
MyProject.HttpApi.Host
(API) and MyProject.Blazor.Client
(WASM) separately.MyProject.Blazor.Client
as the startup project for hot reload and fast debugging.Migrating Your Existing Solution:
*.Blazor.Client
project.Bundling and Global Assets:
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.
Starting from ABP Framework v8.3, there was a change in how audit properties (such as LastModifierId and LastModificationTime) are updated when navigation (child) properties change. In previous versions, updating a child entity through a parent would automatically update the parent's audit columns. However, after the update, this behavior was modified to only update the parent's audit columns if the navigation property itself changes, not just the child entity's data.
This means that if you update only the child entity (e.g., a collection or owned entity) and not the parent entity or its navigation property reference, the parent's audit columns will not be updated automatically.
To restore the previous behavior, you need to explicitly update the parent entity or set a property on the parent to trigger the audit property update when a child entity changes.
Example workaround:
// After updating the child entity
parentEntity.LastModificationTime = DateTime.Now; // or any other property change
await _parentRepository.UpdateAsync(parentEntity);
Alternatively, you can review your domain logic to ensure that any child entity update also marks the parent as modified if you want the audit columns to reflect changes in child entities.
Sources:
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.
The ABP Angular service proxy generator does not currently generate the type alias export type StringValues = string[];
automatically for DTOs that use types like IFormFile
with properties such as headers: Record<string, StringValues>
. This is a known limitation.
As a workaround, you need to manually add export type StringValues = string[];
to your generated proxy files after each regeneration.
This issue is related to how the proxy generator handles certain .NET types and their translation to TypeScript. There is an open issue for similar proxy generation problems:
For more details on Angular service proxy generation, see the official documentation:
Currently, there is no built-in way to customize or extend the proxy generator to automatically include this type alias. You may consider scripting this addition as part of your build process until the generator is improved.
Sources:
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.
To resolve the "ABP-LIC-ERROR - License check failed for 'Volo.Abp.AspNetCore.Mvc.UI.Theme.Commercial-v9.2.1.0'" error in Azure App Service, ensure the following:
AbpLicenseCode
must be available to your application at runtime. In Azure App Service, the recommended approach is to set it as an environment variable in the App Service configuration.Name: AbpLicenseCode
Value: <your-license-code>
Check Configuration File Deployment
appsettings.json
or appsettings.secrets.json
to store the license code, ensure these files are actually deployed and present in the running environment. Missing configuration files are a common cause of this error.Environment Variable Precedence
Case Sensitivity
AbpLicenseCode
(case-sensitive).Restart After Changes
Check for Typographical Errors
Review Application Logs
These steps resolve most license code loading issues in Azure App Service and containerized ABP deployments.
Sources:
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.