This is related to ABP Support Portal reminders, not your application. It happens when a support ticket you opened (or were CC’d on) has a pending “select answer” state. The 404 indicates the ticket/link is no longer accessible (closed, moved, or you’re not authenticated with the correct account), but the reminder job is still sending emails to the original recipients.
Quick actions you can take:
This is not caused by your ABP application code; it’s an account/ticket state issue in the support system. Once the ticket is closed or an answer is selected, reminders will stop.
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.
Pick A if you have ABP Team or higher license and want a maintained integration. Pick B if you prefer a pure Elsa setup.
A) Using ABP Elsa Module (Pro)
[DependsOn(
typeof(Volo.Elsa.Abp.AspNetCore.AbpElsaAspNetCoreModule),
typeof(Volo.Elsa.Abp.Identity.AbpElsaIdentityModule),
typeof(Volo.Elsa.Abp.Application.AbpElsaApplicationModule),
typeof(Volo.Elsa.Abp.Application.Contracts.AbpElsaApplicationContractsModule)
)]
public class WorkflowHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
// Typical ABP auth is already configured via OpenIddict.
// Nothing special here for Elsa; ABP Elsa modules will wire integration.
}
}
builder.Services.AddLoginModule().UseOpenIdConnect(connectConfiguration =>
{
var authority = configuration["AuthServer:Authority"]!.TrimEnd('/');
connectConfiguration.AuthEndpoint = $"{authority}/connect/authorize";
connectConfiguration.TokenEndpoint = $"{authority}/connect/token";
connectConfiguration.EndSessionEndpoint = $"{authority}/connect/endsession";
connectConfiguration.ClientId = configuration["AuthServer:ClientId"]!;
connectConfiguration.Scopes = new[] {
"openid","profile","email","phone","roles","offline_access","<YourResourceName>"
};
});
context.Services.AddElsa(elsa => elsa.UseAbpIdentity(identity =>
{
identity.TokenOptions = options => options.SigningKey = "large-signing-key-for-signing-JWT-tokens";
}));
builder.Services.AddLoginModule().UseElsaIdentity();
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var elsaSection = configuration.GetSection("Elsa");
context.Services.AddElsa(elsa => elsa
.UseEntityFrameworkPersistence(ef =>
DbContextOptionsBuilderExtensions.UseSqlServer(
ef,
configuration.GetConnectionString("Default")))
.AddHttpActivities(elsaSection.GetSection("Server").Bind)
.AddQuartzTemporalActivities()
.AddJavaScriptActivities()
.AddWorkflowsFrom<Startup>() // optional: scan and register workflows
);
context.Services.AddElsaApiEndpoints();
// ABP Anti-forgery exception for Elsa API endpoints
Configure<AbpAntiForgeryOptions>(options =>
{
options.AutoValidateFilter = type =>
type.Assembly != typeof(Elsa.Server.Api.Endpoints.WorkflowRegistry.Get).Assembly;
});
// CORS for Studio if served from a different origin
context.Services.AddCors(cors => cors.AddDefaultPolicy(policy => policy
.AllowAnyHeader()
.AllowAnyMethod()
.AllowAnyOrigin()
.WithExposedHeaders("Content-Disposition")));
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
app.UseCors();
app.UseHttpActivities(); // for HTTP activities
app.UseConfiguredEndpoints();
}
{
"Elsa": {
"Http": {
"BaseUrl": "https://<your-workflow-host-base-url>"
}
}
}
B) Using Elsa without ABP Elsa Module (pure Elsa integration) Use this path if you don’t have ABP Pro Elsa module:
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
var elsaSection = configuration.GetSection("Elsa");
context.Services.AddElsa(elsa => elsa
.UseEntityFrameworkPersistence(ef =>
DbContextOptionsBuilderExtensions.UseSqlServer(
ef,
configuration.GetConnectionString("Default")))
.AddHttpActivities(elsaSection.GetSection("Server").Bind)
.AddQuartzTemporalActivities()
.AddJavaScriptActivities()
.AddWorkflowsFrom<Startup>());
context.Services.AddElsaApiEndpoints();
// CORS if Studio is on another origin
context.Services.AddCors(cors => cors.AddDefaultPolicy(policy => policy
.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()));
// If you embed Studio page, no ABP perm system here; secure via your own middleware or auth.
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
app.UseCors();
app.UseHttpActivities();
app.UseConfiguredEndpoints(endpoints =>
{
// If you add a Razor page hosting Studio component, map fallback to your _Host page
endpoints.MapFallbackToPage("/_Host");
});
}
Notes for ABP Angular UI
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.
Short answer: No. ABP Suite’s built-in Master-Detail generation currently supports a single child level (master → child). It does not generate a full 3-level nested hierarchy (e.g., Lesson → Tests → Questions) out of the box for the Angular UI.
What you can do:
Reference to the related support ticket: The existing thread confirms Suite handles master-child but not multi-level nested generation. You can use it as confirmation and guidance.
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.
Per the official ABP Elsa Pro module list, the Application layer modules are:
Example:
using Volo.Abp.Modularity;
using Volo.Elsa.Abp.Application;
using Volo.Elsa.Abp.Application.Contracts;
[DependsOn(
typeof(AbpElsaApplicationContractsModule),
typeof(AbpElsaApplicationModule)
)]
public class MyApplicationModule : AbpModule
{
}
There is no Volo.Abp.ElsaPro.Application.Contracts package to reference for this module.
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.
Important facts (from the docs)
A) Add the correct ABP Elsa Pro module dependencies Add these modules to the projects where you need integration (typically your host and the module that defines permissions). These are the module types and their packages as documented:
Example for your Host module:
using Volo.Abp.Modularity;
using Volo.Elsa.Abp.AspNetCore;
using Volo.Elsa.Abp.Identity;
using Volo.Elsa.Abp.Application;
using Volo.Elsa.Abp.Application.Contracts;
[DependsOn(
typeof(AbpElsaAspNetCoreModule),
typeof(AbpElsaIdentityModule),
typeof(AbpElsaApplicationModule),
typeof(AbpElsaApplicationContractsModule)
)]
public class MyHostModule : AbpModule
{
}
Notes:
B) Add Elsa EF Core persistence (this is what creates the tables) In the Host (HttpApi.Host) or the service that executes, register Elsa with EF persistence using the same connection string you want for Elsa:
using Elsa;
using Elsa.Persistence.EntityFramework.Core.Extensions;
using Microsoft.EntityFrameworkCore;
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services
.AddElsa(elsa =>
{
elsa.UseEntityFrameworkPersistence(ef =>
ef.UseSqlServer(configuration.GetConnectionString("Default")));
});
// Optional: expose Elsa API endpoints for management if needed
context.Services.AddElsaApiEndpoints();
}
Appsettings (Host and DbMigrator):
"ConnectionStrings": {
"Default": "Server=.;Database=YourDb;Trusted_Connection=True;TrustServerCertificate=True"
}
C) Make DbMigrator apply Elsa migrations Elsa migrations are separate from your ABP DbContext. Wire Elsa EF persistence in DbMigrator and explicitly migrate Elsa’s DbContext at startup.
using System.Threading.Tasks;
using Elsa;
using Elsa.Persistence.EntityFramework.Core.DbContexts;
using Elsa.Persistence.EntityFramework.Core.Extensions;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp;
using Volo.Abp.Modularity;
public class MyDbMigratorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services.AddElsa(elsa =>
{
elsa.UseEntityFrameworkPersistence(ef =>
ef.UseSqlServer(configuration.GetConnectionString("Default")));
});
}
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
using var scope = context.ServiceProvider.CreateScope();
var factory = scope.ServiceProvider.GetRequiredService<IDbContextFactory<ElsaContext>>();
await using var elsaDb = await factory.CreateDbContextAsync();
await elsaDb.Database.MigrateAsync(); // Creates WorkflowDefinition, WorkflowInstance, etc.
}
}
Run DbMigrator. It will execute Elsa’s EF migrations and create the Elsa tables.
D) Modular API considerations
E) Verify
Common pitfalls fixed
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.
Important facts (from the official docs):
Prerequisites
Step-by-step
A) Add the Elsa Pro integration modules to your services Add the following package/module dependencies to the service (module) where you will expose Elsa endpoints and permissions (typically your “Administration” or a specific module’s HttpApi.Host, Application, etc.). At minimum:
Example (in your HttpApi.Host module):
using Volo.Abp.Modularity;
using Volo.Elsa.Abp.AspNetCore;
using Volo.Elsa.Abp.Identity;
using Volo.Elsa.Abp.Application;
using Volo.Elsa.Abp.Application.Contracts;
[DependsOn(
typeof(AbpElsaAspNetCoreModule),
typeof(AbpElsaIdentityModule),
typeof(AbpElsaApplicationModule),
typeof(AbpElsaApplicationContractsModule)
)]
public class MyServiceHttpApiHostModule : AbpModule
{
}
Do similarly in Application and Application.Contracts modules if you need to reference Elsa permissions at those layers.
B) Add Elsa EF Core persistence to your infrastructure Elsa’s runtime needs its own persistence configuration. In a typical ABP host (HttpApi.Host) or infrastructure module:
In your Host’s ConfigureServices:
using Elsa;
using Elsa.Persistence.EntityFramework.Core.Extensions;
using Microsoft.EntityFrameworkCore;
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services
.AddElsa(elsa =>
{
elsa.UseEntityFrameworkPersistence(ef =>
ef.UseSqlServer(configuration.GetConnectionString("Default")));
});
// If Elsa Studio or endpoints are needed, also add Elsa API endpoints:
context.Services.AddElsaApiEndpoints();
}
Notes:
C) Make DbMigrator apply Elsa migrations Your DbMigrator should also reference Elsa EF Core provider packages and run Elsa’s migrations. In DbMigrator project:
In DbMigrator’s program/module:
using Elsa;
using Elsa.Persistence.EntityFramework.Core.Extensions;
using Microsoft.EntityFrameworkCore;
public class MyDbMigratorModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
var configuration = context.Services.GetConfiguration();
context.Services
.AddElsa(elsa =>
{
elsa.UseEntityFrameworkPersistence(ef =>
ef.UseSqlServer(configuration.GetConnectionString("Default")));
});
}
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
// Apply Elsa migrations
var scope = context.ServiceProvider.CreateScope();
var dbContextFactory = scope.ServiceProvider.GetRequiredService<IDbContextFactory<Elsa.Persistence.EntityFramework.Core.DbContexts.ElsaContext>>();
await using var elsaDb = await dbContextFactory.CreateDbContextAsync();
await elsaDb.Database.MigrateAsync();
// Your normal ABP migrations run here as usual (if you have them packaged or via your app DbContext)
}
}
This ensures DbMigrator applies Elsa’s own EF Core migrations at runtime, creating tables like WorkflowDefinition, WorkflowInstance, etc.
D) Configure authentication/authorization for Elsa endpoints
E) Verify the setup
Common pitfalls
F) Compare with the official sample Check the “Elsa Workflows - Sample Workflow Demo” to see a working end-to-end configuration and adapt it to a modular solution structure.
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.
Backend (AuthServer/OpenIddict + HttpApi.Host)
Angular 6) Use production build and lazy loading
Checklist to validate quickly
This approach aligns with common ABP conventions, but specific official documentation for this exact performance 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.
Prerequisites
Steps
A) Add Elsa Pro module packages to your solution
B) Declare module dependencies
// Domain.Shared
[DependsOn(
typeof(AbpDddDomainSharedModule),
typeof(AbpValidationAbstractionsModule),
typeof(AbpAuthorizationAbstractionsModule),
typeof(AbpIdentityDomainSharedModule),
typeof(AbpFeatureManagementDomainSharedModule),
typeof(AbpOpenIddictDomainSharedModule),
typeof(AbpTenantManagementDomainSharedModule),
typeof(AbpSettingManagementDomainSharedModule),
typeof(AbpAuditLoggingDomainSharedModule),
typeof(AbpBackgroundJobsDomainSharedModule),
typeof(AbpPermissionManagementDomainSharedModule),
typeof(AbpLocalizationModule),
typeof(AbpTimingModule),
typeof(Volo.Abp.ElsaPro.DomainShared.ElsaProDomainSharedModule) // Example name; use the exact type from the package
)]
public class YourProjectDomainSharedModule : AbpModule
{
}
// Domain
[DependsOn(
typeof(YourProjectDomainSharedModule),
typeof(Volo.Abp.ElsaPro.Domain.ElsaProDomainModule)
)]
public class YourProjectDomainModule : AbpModule
{
}
// Application.Contracts
[DependsOn(
typeof(YourProjectDomainSharedModule),
typeof(Volo.Abp.ElsaPro.Application.Contracts.ElsaProApplicationContractsModule)
)]
public class YourProjectApplicationContractsModule : AbpModule
{
}
// Application
[DependsOn(
typeof(YourProjectApplicationContractsModule),
typeof(YourProjectDomainModule),
typeof(Volo.Abp.ElsaPro.Application.ElsaProApplicationModule)
)]
public class YourProjectApplicationModule : AbpModule
{
}
// HttpApi
[DependsOn(
typeof(YourProjectApplicationContractsModule),
typeof(Volo.Abp.ElsaPro.HttpApi.ElsaProHttpApiModule)
)]
public class YourProjectHttpApiModule : AbpModule
{
}
// HttpApi.Host (or Web)
[DependsOn(
typeof(YourProjectHttpApiModule),
typeof(YourProjectApplicationModule),
typeof(Volo.Abp.ElsaPro.HttpApi.Host.ElsaProHttpApiHostModule)
)]
public class YourProjectHttpApiHostModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
// Configure authentication/authorization for Elsa endpoints if needed
}
}
Note: Use the exact module types from the installed packages. Names above illustrate the layering; your package exposes module classes you can discover via IDE “Go to definition”.
C) Wire up EF Core integration for Elsa Pro
public static class YourProjectDbContextModelCreatingExtensions
{
public static void ConfigureYourProject(this ModelBuilder builder)
{
// Your existing configurations...
// Add Elsa Pro EF Core mappings (the actual extension method/type name comes from the package)
builder.ConfigureElsaPro(); // Example; use the actual provided extension method
}
}
D) Connection strings and appsettings
Example:
"ConnectionStrings": {
"Default": "Server=.;Database=YourDb;Trusted_Connection=True;TrustServerCertificate=True"
}
E) Run migrations for Elsa Pro domain entities
If Elsa Pro ships its own migrations in the package:
F) Expose and test Elsa endpoints/UI
G) Common pitfalls and fixes
H) Minimal verification checklist
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.
Root cause: HealthChecks.UI (Xabaril) internally uses IdentityModel for some scenarios (e.g., OAuth2 discovery, client credentials). In certain dependency graphs, IdentityModel isn’t copied to the output when it’s only a transitive dependency. Then the HealthChecks UI background collector fails with “Could not load file or assembly 'IdentityModel, Version=5.2.0.0'”.
Quick fix (per project failing at runtime, e.g., *.Web and *.ApiHost):
<ItemGroup>
<PackageReference Include="IdentityModel" Version="5.2.0" />
</ItemGroup>
services
.AddHealthChecks()
.AddCheck<MyProjectNameDatabaseCheck>("Database");
services.AddHealthChecksUI(settings =>
{
settings.AddHealthCheckEndpoint("Self", "/health-status"); // or your configured URL
})
.AddInMemoryStorage();
settings.AddHealthCheckEndpoint("Self", $"http://{System.Net.Dns.GetHostName()}/health-status");
Otherwise keep using the configured healthCheckUrl string.
Why this is safe: The IdentityModel package is a pure client library (no side effects if unused at runtime) and matches the HealthChecks UI’s transitive expectation. Adding it explicitly pins the assembly and avoids loader failures.
Optional: Align HealthChecks packages
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.
Why it happens
Fix step-by-step
public class SaasFeaturesDefinitionProvider : FeatureDefinitionProvider
{
public override void Define(IFeatureDefinitionContext context)
{
var group = context.GetGroupOrNull(ModulesFeatures.Main)
?? context.AddGroup(ModulesFeatures.Main, L("MainFeatures"));
group.AddFeature(
SaasFeatures.Saas,
defaultValue: "true",
displayName: L(SaasFeatures.Saas),
isVisibleToClients: true // critical for WASM menu visibility
);
}
private static LocalizableString L(string name)
=> LocalizableString.Create<PlatformResource>("Features:" + name);
}
[DependsOn(
typeof(AbpFeaturesModule),
typeof(Payhas.Common.FeaturesModule) // your package/module that defines groups & features
)]
public class PlatformDomainModule : AbpModule
{
}
var saas = context.Menu.GetMenuItem(SaasHostMenus.GroupName);
saas.RequireFeatures(SaasFeatures.Saas);
The client reads features from the Application Configuration endpoint, which is cached by default on the client side. Reloading the page after changing features is typically enough; server-side feature store uses distributed cache. Ensure your distributed cache (e.g., Redis) is correctly configured in all services that participate.
Expected outcome
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.