This error is thrown by AspNetCore.Diagnostics.HealthChecks UI’s background collector (HealthChecks.UI.Core.HostedService.HealthCheckCollectorHostedService). In some dependency graphs (commonly after upgrading ABP to v10), the IdentityModel assembly that HealthChecks.UI expects is not copied to the output, so the hosted service crashes repeatedly with:
Could not load file or assembly 'IdentityModel, Version=5.2.0.0'
Fix (recommended): add an explicit package reference to IdentityModel in the project(s) where you call AddHealthChecksUI() / MapHealthChecksUiEndpoints() (typically *.HttpApi.Host, and in some solutions also *.Web):
Option A (match the requested assembly version exactly):
<ItemGroup>
<PackageReference Include="IdentityModel" Version="5.2.0" />
</ItemGroup>
Option B (use the newer version ABP team suggested in a similar case):
<ItemGroup>
<PackageReference Include="IdentityModel" Version="7.0.0" />
</ItemGroup>
Then:
dotnet cleanbin/obj for the affected host project(s)dotnet restoreIf you have multiple hosts/services each registering HealthChecks UI, add the reference to each of those host projects (only where the UI collector runs).
Links (validated):
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.
...Blazor.Page.Partials.Modal.Field.DateTime.NonNullable.txt) are taken from the exact Volo.Abp.Commercial.SuiteTemplates version that your solution actually resolves and builds with. When you upgrade afterwards, it’s common that some projects still resolve an older Volo.Abp.Commercial.SuiteTemplates (or an older output DLL is still what Suite loads) even though the main app runs.*.HttpApi.Host.csproj or *.Web.csproj):dotnet list path\to\YourHostProject.csproj package --include-transitive | findstr /i "Volo.Abp.Commercial.SuiteTemplates"
Directory.Packages.props / central package management) so it is exactly 10.5.0.dotnet nuget locals all --clear
dotnet restore
bin and obj under the whole solutiondotnet build
Make sure ABP Suite is not launching another installed copy
Retry entity generation
If steps (1)-(4) are correct, the missing template resource error disappears because Suite will load a Volo.Abp.Commercial.SuiteTemplates assembly that actually contains the 10.5.0 Blazor templates.
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.
Volo.Abp.Commercial.SuiteTemplates assembly produced by your solution build, so ABP Suite version and Volo.Abp.Commercial.SuiteTemplates package version must match, and the solution must be built with a clean output.Make sure ABP Suite is exactly the same version as your solution (10.5.0)
Make sure your solution references Volo.Abp.Commercial.SuiteTemplates = 10.5.0
Directory.Packages.props / Directory.Build.props).10.5.0 everywhere.Hard clean outputs (most common cause)
bin and obj folders under the entire solution (every project).Build the solution once after the clean
If you do (1)-(4), Suite will load the correct SuiteTemplates resources and the missing template error (e.g., ...Blazor.Page.Partials.Modal.Field.DateTime.NonNullable.txt) will disappear.
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.
Practical guidance for your case
Where to read (official docs)
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.
Volo.AIManagement.VectorStores.* packages). There is no mention of SQL Server as a supported vector store provider.If you need SQL Server vectors now, the supported approach in ABP is to implement a custom vector store provider (register your own factory so it appears in the “Vector Store Provider” dropdown) and integrate SQL Server’s vector features behind that abstraction.
Links (verified):
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.
In LeptonX (MVC) the topbar/sidebar UI pieces are re-initialized after partial page updates (ABP’s dynamic DOM updates / SPA-like navigation). When that happens, LeptonX can replace (or re-render) the menu/link/badge elements, so the elements you updated are no longer the “live” ones. The symptom is exactly what you described: you see the visual DOM once, but later your updates don’t reflect, because you’re updating a stale node or your changes are overwritten by the theme’s initializer.
Fix: Treat LeptonX-rendered DOM as disposable and always re-apply your badge/list rendering after ABP DOM updates using ABP’s DOM API, and always query the DOM at the time you update (never cache element references). Concretely:
applyUnreadCountToDom).abp.dom.onNodeAdded (ABP DOM API) so it runs when LeptonX/ABP re-adds the toolbar node.#notification-bar (you already started doing this—keep it everywhere, including #NotificationNewBadge, which can also become duplicated if the toolbar re-renders).Here is the minimal pattern that works reliably with LeptonX + ABP dynamic DOM updates (drop-in concept; adapt into your current script):
<script>
(function () {
'use strict';
var state = { unread: 0 };
function applyUnreadCountToDom() {
// Always re-query (never keep old references)
var bar = document.getElementById('notification-bar');
if (!bar) return;
var badge = bar.querySelector('.menu-item-badge');
if (badge) {
badge.setAttribute('data-count', state.unread);
badge.textContent = state.unread > 99 ? '99+' : String(state.unread);
// If your CSS uses opacity/visibility, toggle them here too (optional)
if (state.unread > 0) {
badge.style.opacity = '1';
badge.style.visibility = 'visible';
} else {
badge.style.opacity = '0';
badge.style.visibility = 'hidden';
}
}
// IMPORTANT: scope this too (don’t use global #NotificationNewBadge if toolbar can re-render)
var newBadge = bar.querySelector('#NotificationNewBadge');
if (newBadge) {
newBadge.setAttribute('data-count', state.unread);
newBadge.textContent = state.unread + ' NEW';
newBadge.style.opacity = state.unread > 0 ? '1' : '0';
newBadge.style.visibility = state.unread > 0 ? 'visible' : 'hidden';
}
}
function fetchCount() {
if (!window.abp?.ajax) return;
abp.ajax({
url: (abp.appPath || '') + 'api/notification/private-message/unread-count',
type: 'GET',
success: function (response) {
var num = parseInt((response && response.result != null) ? response.result : response, 10) || 0;
state.unread = num;
applyUnreadCountToDom();
}
});
}
// 1) Initial run
fetchCount();
// 2) Re-apply after ABP adds/replaces DOM nodes (LeptonX/toolbar redraw)
// This is the key difference vs. only using abp.event / setInterval.
if (window.abp?.dom?.onNodeAdded) {
abp.dom.onNodeAdded(function (node) {
// Only react when our toolbar node is added/replaced
if (node && node.id === 'notification-bar') {
applyUnreadCountToDom();
}
});
}
// 3) Polling (as you already do)
window.__notificationPollTimer = window.__notificationPollTimer || setInterval(fetchCount, 30000);
})();
</script>
What this changes vs your current approach:
abp.event.on('abp.domUpdated', ...). In LeptonX scenarios, the safer hook is ABP DOM API node-added detection (abp.dom.onNodeAdded), because it runs when the actual node is reinserted/replaced, and you immediately re-apply your state to the fresh DOM.#notification-bar.If you still want to keep abp.event.on('abp.domUpdated', ...), keep it, but you should still add the abp.dom.onNodeAdded hook above; that’s the part that makes the DOM updates deterministic with LeptonX redraws.
Sources (verified):
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.
No, ABP 10.4.1 does not require a dedicated worker app just to send emails. The built-in background job worker can process email jobs inside the same web host, as long as background job execution is actually enabled and there is no NullEmailSender replacement in that host.
In your case the key signal is: Email Confirmation is also not sent. That strongly indicates this is not “MFA-specific”, but rather one of these common post-migration causes:
NullEmailSender (often added under #if DEBUG in the host module, or effectively happening due to environment/config differences after migration).AbpBackgroundJobs, but not executed (job worker not running, disabled, or running in a different process than you think).NullEmailSender replacement in your web host (the app that runs the login/registration pages)
#if DEBUG
context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
#endif
NullEmailSender in debug builds.Confirm the background job is actually being executed
AbpBackgroundJobs, verify they are not just accumulating.Make sure SMTP settings are configured for the same host that executes the jobs
Re-check 2FA email provider prerequisites (only after email sending is 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.
ABP Suite’s Angular proxy generation is not incremental and not selective: when you generate proxies, it regenerates the proxy files from the backend API Definition (/api/abp/api-definition). Because of that, it can rewrite already-committed proxy files (remove methods, rename method URLs, etc.) if the server-side API surface it reads differs from what your previously generated employee.service.ts was based on.
In ABP (including v10.4), the generated Angular URLs come from server metadata, not from the existing TypeScript file. So when you regenerate proxies, the tool will:
GetEmployeeLookup disappears),Practical resolution (to stop proxy generation from breaking already-committed code):
src/app/proxy/**. Treat them as generated artifacts.employee-api.service.ts) that calls the generated proxy service, and only commit/use your wrapper in business code. Then proxy regeneration won’t break your app code, only the generated layer./api/app/employees/grade-lookup etc., make sure the backend controller/action routes are explicitly fixed with attributes (e.g., [Route("api/app/employees")] on the controller + [HttpGet("grade-lookup")] on the action), and that these endpoints are visible in /api/abp/api-definition. Then regenerate proxies; the generated URLs will match those explicit routes.If your backend code truly still has the old routes but the generator produces /employee-grade-lookup style paths, that indicates the backend API definition being used during generation is not the one you think (common causes: generating against a different host/port, wrong environment, wrong gateway in tiered setup). Fix by generating proxies against the correct running endpoint that exposes the real API definition for that app.
There is no ABP Suite UI option to generate proxies only for a single entity/service. (So the correct approach is to isolate generated files and rely on wrappers, or regenerate and commit generated output as a whole.)
Links (verified):
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.
In ABP 10.x the email 2FA code is only sent if the user actually has an available/verified 2FA provider. For the Email provider this effectively means: the user’s email must be verified (and similarly for SMS the phone must be verified). If the user doesn’t have a usable provider, ABP/Identity can still redirect to the “enter security code” step, but no code is generated/sent.
Fix (verify from DB/UI, not only what you “expect” logically):
Also ensure you didn’t accidentally end up with NullEmailSender in your environment (a common “works elsewhere / not here” symptom after migrations is that one host (AuthServer / HttpApi.Host) is still using a null sender, while another host sends fine). In ABP solutions, the 2FA email is sent by the AuthServer/Host that performs the login, so SMTP must be configured there too.
Reference behavior in ABP docs (this is the key rule that blocks sending the code):
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.
Update ABP Studio
If you upgraded ABP to 10.4 and MCP broke
If “fails to start” is actually an auth/network block inside Studio
abp.io and its subdomains are reachable/allowlisted.Sources (validated)
If this is a license / ABP Studio account-type issue on your environment, please contact us at: https://abp.io/contact
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.