The fix referenced in #10853 (implemented by PR #26017) was not released in 10.6.1.
Based on the available verified information, it was scheduled for “an upcoming release” at the time of the #10853 answer, but the exact version (e.g., 10.6.2/10.6.3 vs 10.7.0+) is not explicitly stated in any verified source I can access here.
Since you can still reproduce “session never saved when the client disconnects” on 10.6.1, the safe/confirmed conclusion is: it is not included in 10.6.1; the earliest version containing it cannot be definitively confirmed from verified sources in this environment.
Practically: if you need a deterministic server-side behavior today, your current mitigation of adding /connect/token to AbpAspNetCoreUnitOfWorkOptions.IgnoredUrls (or equivalent “commit-before-flush” approach) is consistent with the framework-side fix described in #10853, and you should keep it until you upgrade to a version where you can confirm the fix is present by testing.
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.
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.
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.
Unexpected token '<', "<!doctype "... is not valid JSON error means the MCP tool call is receiving HTML instead of JSON. In practice (for ABP CLI/Studio), this typically happens when the underlying ABP backend endpoint returns an HTML error/login/forbidden page rather than the expected JSON payload.dotnet tool update -g Volo.Abp.Studio.Cli
abp logout
abp login
abp login actually succeeds in the same environment/user that Claude is launching abp mcp from.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.
sessionStorage under abp_tenant_id and sends it to the backend with the __tenant HTTP header on requests. So, if your MCP server is a custom, separate “streamable HTTP” endpoint, ABP AI Workspace does not automatically forward the current tenant to that external MCP server unless you explicitly implement such forwarding in your MCP server integration.__tenant (or, if you are calling your MCP server from your React app directly, make your client include __tenant header using the value from sessionStorage['abp_tenant_id']).Expect this header on your MCP server:
__tenant: <tenantId> (GUID as string)In ASP.NET Core (example), read it like:
app.MapPost("/mcp", async (HttpContext httpContext) =>
{
var tenantId = httpContext.Request.Headers["__tenant"].ToString(); // may be empty for Host
// use tenantId in your logic
});
__tenant header from:sessionStorage.getItem("abp_tenant_id")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.
disabled input mirrored via an effect(...), and the inherited setDisabledState(...) path still doesn’t trigger view refresh (markForCheck()), so a reactive-forms disable can be lost/overwritten.What you should do now (until the permanent fix is released)
Keep using one of these workarounds:
[disabled] to the form/form-control disabled state.main.ts prototype patch from ticket #10904 (the one that merges _inputDisabled + _formDisabled and calls cdRef.markForCheck() in setDisabledState).Open a new support ticket (as you did) and reference that:
effect(() => this.disabled = this.disabledInput()) behavior and setDisabledState still doesn’t markForCheck().main.ts patch from #10904 still fixes it.
This will allow the ABP team to link it to their internal issue tracker and respond with the planned patch version (e.g., 10.7.1 / 10.7.2 / 10.8).Sources (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.
In ABP Blazor WASM/WebApp, the client-side localization is resource-based and module-based, and each module typically embeds a set of JSON files for many cultures under its virtual file system (VFS). When the WASM client decides it needs a given localization resource, it pulls the resource’s JSON files exposed by the host. That’s why you see “module localization texts” as a big chunk of startup time, and why it repeats on each F5 (because the WASM runtime/app is restarted and re-initializes its localization store).
ABP’s localization fallback rules are indeed culture-based (requested culture → base culture → default culture, etc.). Those fallback rules are documented, but they do not imply the framework will only download those cultures; it only implies how a key is resolved once the relevant dictionaries are present.
So, your understanding of fallback is correct, but the current loading strategy is not “download only what’s required for fallback”.
As of the verified ABP docs available here, there is no documented/supported option that tells the Blazor WASM client to “only download the cultures configured in the application + fallbacks” for module-provided virtual JSON localization files. (So there’s no officially documented switch I can point you to that changes this behavior in 10.7.)
Practical mitigations you can apply without changing ABP internals:
For the other startup costs you listed (resource-collection.js, generate-proxy.json, etc.), those are separate pipelines (static asset discovery and dynamic proxy metadata). The “load everything each F5” characteristic is normal for an Interactive WASM app because the browser refresh restarts the app; caching helps network, but not parsing/processing/DI initialization time.
Sources (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.
LimitedResultRequestDto is an ABP Framework type and it should come from the Volo.Abp.Application.Dtos namespace (same place as PagedResultRequestDto).PagedResultRequestDto inherits from LimitedResultRequestDto (so Suite templates referencing LimitedResultRequestDto is consistent with the framework DTO hierarchy).What to do in your solution (ABP 10.7.0):
Ensure your projects reference the correct ABP package(s)
LimitedResultRequestDto, PagedResultRequestDto, etc.) come from ABP’s application contracts layer packages (transitively or directly).*.Application.Contracts and/or *.TestBase / *.Tests) references ABP 10.7.0 packages consistently (no mixed versions).Clean and restore to eliminate stale assemblies
bin/obj for the solution (or run dotnet clean + delete bin/obj).dotnet restoreIf you still can’t compile because the type is missing
Volo.Abp.* package versions to 10.7.0 (including test projects).Reference (contains the LimitedResultRequestDto and shows its relationship to PagedResultRequestDto / PagedAndSortedResultRequestDto):
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.
What you’re seeing is coming from the Angular proxy generator trying to translate some problematic server-side types that the AI Management module exposes in its HTTP API contract (via /api/abp/api-definition?includeTypes=true). In ABP 10.7, those types end up producing invalid TypeScript in the generated models.ts files:
ActionResult declarations (non-generic + generic with the same name).ChatRole being emitted as interface ChatRole extends any, which is invalid TypeScript.There isn’t a supported switch to say “keep module backend/UI functionality but don’t generate its client-side types when I run the default abp generate-proxy -t ng”. The supported approach is to generate proxies per module when you need them, instead of generating everything into the main app proxies.
Supported workaround (recommended): generate only the AI Management proxies separately
abp generate-proxy -t ng --module aiManagement
This is the documented way to generate the AI Management module’s Angular services/models.
abp generate-proxy -t ng --module app
and generate AI Management only when/where you need it using the --module aiManagement command above.
Sources (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.
abp-modal is implemented on top of ng-bootstrap’s NgbModal, which appends ngb-modal-window / ngb-modal-backdrop to document.body. When your app (or theme) sets .cdk-overlay-container { z-index: 10000 !important; } and ng-bootstrap modal/backdrop stays at a lower z-index (e.g., 9999), the modal will render behind the CDK overlay stack.windowClass / backdropClass via the [options] input (ABP spreads options() into NgbModal.open(...)), then override z-index globally.<abp-modal
[(visible)]="openViewDocument"
[options]="{
windowClass: 'abp-above-cdk',
backdropClass: 'abp-above-cdk-backdrop'
}"
>
<ng-template #abpBody>...</ng-template>
</abp-modal>
Put the CSS in a global stylesheet (recommended), so you don’t need ::ng-deep:
ngb-modal-window.abp-above-cdk { z-index: 10001 !important; }
ngb-modal-backdrop.abp-above-cdk-backdrop { z-index: 10001 !important; }
Notes:
Using a component-scoped stylesheet forces you into ::ng-deep because the modal elements are not inside the component’s DOM tree (they’re appended to body).
Your current CSS values confirm the root cause: 9999 < 10000, so it will always lose against .cdk-overlay-container.
Issue 2 (contentChild('abpBody') + *ngIf on <ng-template>): In ABP 10.6, abp-modal uses Angular’s signal-based contentChild('abpBody'). That query will not reliably find a template reference that is structurally wrapped (like <ng-template *ngIf ... #abpBody>), because *ngIf on an <ng-template> creates an additional outer template layer.
Fix in application code: keep exactly one projected <ng-template #abpBody> and move conditional logic inside it (as you already did):
<abp-modal [(visible)]="showModal">
<ng-template #abpBody>
<app-edit-form *ngIf="isEditMode"></app-edit-form>
<app-view-only *ngIf="!isEditMode"></app-view-only>
</ng-template>
</abp-modal>
This pattern aligns with how ABP’s modal is documented/used (single #abpBody template projected into the component).
#abpHeader/#abpBody/#abpFooter templates (single templates) into <abp-modal>. Your “two #abpBody templates toggled by *ngIf” is not a documented usage pattern, and it becomes fragile with signal-based content queries.zIndex input, container option, or a migration note specifically about contentChild() + *ngIf on <ng-template #abpBody>.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.