Activities of "AI-Bot"

  • abp login is only for ABP CLI (downloading commercial libs, templates, etc.). It does not affect where Yarn/NPM searches for Angular packages.
  • @abp/ng.components is a public NPM package. If Yarn says it can’t find it, you are almost certainly not hitting the public registry (or you have an .npmrc/.yarnrc that overrides the registry).

Do the following in your Angular folder:

  1. Ensure you are using the public NPM registry
yarn config set registry https://registry.npmjs.org
npm config set registry https://registry.npmjs.org
  1. Remove possible local artifacts and retry
rm -rf node_modules yarn.lock package-lock.json
yarn cache clean
yarn install
  1. Check for registry overrides (fix/remove if they point to a private feed)
  • Look for these files and check registry=... or scope registries like @abp:registry=...:
    • ./.npmrc
    • ~/.npmrc
    • ./.yarnrc / ~/.yarnrc

After fixing the registry override, yarn install should resolve @abp/ng.components@~9.1.1 normally.

Links:

  • https://abp.io/docs/latest/get-started/pre-requirements
  • https://abp.io/support/questions/2932

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.

  • ConcurrencyStamp is not the reason for the timeout. If the ConcurrencyStamp mismatches, EF Core/ABP would typically result in a concurrency exception (0 rows affected), not a “wait 30s then timeout”. A timeout on that statement means SQL Server is waiting (usually on locks) or the DB is throttling.

  • Yes, ABP applies Unit of Work to all public Application Service methods, including Get... methods.
    Additionally, by default ABP’s UOW transaction behavior is Auto, and HTTP GET requests don’t start a transactional UOW (no explicit DB transaction is created). But the method is still inside a UOW pipeline, and if you do writes (like UpdateAsync) inside a GET, it will still persist changes (via SaveChanges at the end of the UOW / repository autoSave, depending on your code).

  • About the “EF Core 9 command batching holds locks longer” hint: I can’t verify that claim from ABP/EF sources in the available context here, so I won’t confirm it. What is verifiable and relevant in ABP is: doing UpdateAsync inside a frequently-called GET method can create unexpected write load and lock contention, which does match your symptom.

What to do (definitive ABP guidance):

  1. Remove any update call from GET methods. Split into:

    • Get... (read-only)
    • Update... (POST/PUT) for writes
      This alone often eliminates these “random timeouts”.
  2. If you must keep the GET read-only and want to enforce it, disable UOW or at least make it explicitly non-transactional and don’t call update:

using Volo.Abp.Uow;

[UnitOfWork(IsDisabled = true)]
public virtual async Task<AgentDto> GetAsync(Guid id)
{
    // read-only
}
  1. If the method truly must write (not recommended for GET), make it a non-GET endpoint and (optionally) force a transactional UOW explicitly so behavior is consistent:
[UnitOfWork(IsTransactional = true)]
public virtual async Task<AgentDto> TouchAndGetAsync(Guid id)
{
    // do update + read
}

(verified references)

  • https://abp.io/docs/latest/framework/architecture/domain-driven-design/unit-of-work
  • https://abp.io/community/articles/0r248xsr

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.

  • This warning is shown when ABP Studio currently considers your session as “Community Edition” (even if you’re signed in) and therefore applies the community solution/module limit.
  • The most common fix is to log out from inside ABP Studio (not just restart/close the app) so the license is re-fetched and the local session/cache is refreshed.

Fix (verified workaround)

  1. In ABP Studio, open Account/Profile menu (top-right) and click Log out.
  2. Close ABP Studio completely.
  3. Start ABP Studio again and Log in with the account that is assigned to the Business license.
  4. Re-open your solution.

If you were only restarting ABP Studio without logging out, it can keep using the old Community session state and continue showing this warning (this matches a previously reported case).

For anything license/account related beyond this (e.g., your user not actually assigned to the organization/license on abp.io), please contact the licensing/support team:
https://abp.io/contact

Links you can cross-check:

  • https://abp.io/support/questions/10491
  • https://abp.io/docs/latest/studio
  • https://abp.io/community/articles/kcfec59b

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.

  • This looks like a real bug in the AI Management Blazor ChatClientChat component (ABP 10.2.0): when it restores chat history from browser local storage, at least one stored message can have null text/markdown, and the component ends up calling Markdig with a null string (Markdown.ToHtml(null, ...)), which throws System.ArgumentNullException (markdown) and breaks the Blazor circuit.

  • Your workaround (clearing site data/local storage) is consistent with this: it removes the persisted conversation that contains a null-content message.

  • There is no verified public fix note/ticket I can point to for ABP 10.2.0 specifically (and I can’t access the commercial source here to confirm whether it’s already patched internally). Practically, until you update to a version where this is fixed, the only deterministic mitigations are:

    1. Avoid restoring the problematic conversation by changing ConversationId (e.g., include a version suffix like "...-v2" so a new local-storage key is used), or
    2. Clear the stored conversation (your current workaround).
  • If you embed the widget yourself (not the built-in playground page), you can also make it resilient by ensuring you never pass a null markdown string into a markdown renderer (i.e., normalize null to "" before rendering). The crash indicates the playground’s own rendering path is missing that guard.

Sources:

  • https://abp.io/docs/10.2//modules/ai-management/ (the component persists/restores chat via ConversationId)
  • https://abp.io/support/questions/2028 (ABP team previously acknowledged the same Markdig null-markdown exception pattern as an “unexpected behavior” to be 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.

  • You can store your custom “extended” user properties in physical columns on AbpUsers and still post them from your custom tab, but the post payload will still go through UpdateProfileDto, whose extensibility mechanism is ExtraProperties.
    The key point is: Map the extension property to an EF Core column (so it’s stored physically), then send it in ExtraProperties (so the Profile API can carry it). ABP will persist it into the mapped column.

1) Map the extension property to a physical column (EF Core)

In your EntityFrameworkCore project, in *EfCoreEntityExtensionMappings.Configure():

ObjectExtensionManager.Instance
    .MapEfCoreProperty<IdentityUser, string>(
        "MiddleName",
        (entityBuilder, propertyBuilder) =>
        {
            propertyBuilder.HasMaxLength(64);
            propertyBuilder.HasDefaultValue("");
        }
    );

Create/apply migration => a real MiddleName column is created on AbpUsers.

2) Ensure the Profile API applies extension properties on update

In your AuthServer (or whichever host contains the ProfileAppService in your tiered solution), run:

ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi(
    IdentityModuleExtensionConsts.ModuleName,
    IdentityModuleExtensionConsts.EntityNames.User,
    getApiTypes: new[] { typeof(ProfileDto) },
    updateApiTypes: new[] { typeof(UpdateProfileDto) }
);

This is required so UpdateProfileDto.ExtraProperties is mapped onto the user entity during profile updates (and therefore persisted to your physical column mapping).

3) JS/form post from your custom tab

Even though storage is a physical column, you still post like this (because the contract is UpdateProfileDto):

var input = $("#MyPersonalSettingsForm").serializeFormToObject();

input.ExtraProperties = input.ExtraProperties || {};
input.ExtraProperties.MiddleName = $("#MiddleName").val();

volo.abp.account.profile.update(input);

After step (1) + (2), ABP will save MiddleName into the AbpUsers.MiddleName column (not JSON), because you mapped it with MapEfCoreProperty.

Links:

  • https://abp.io/community/articles/nsyhrtna
  • https://abp.io/docs/10.2/framework/fundamentals/object-extensions

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 your custom tab, post normal fields by naming inputs exactly like UpdateProfileDto properties (UserName, Name, Surname, Email, PhoneNumber, …), then add your custom fields under ExtraProperties and call volo.abp.account.profile.update(...).

1) Razor/CSHTML (custom tab view)

Bind normal fields to ProfileDto, and render custom fields from ExtraProperties:

@using Volo.Abp.Data
@model Volo.Abp.Account.ProfileDto

<form id="MyPersonalSettingsForm">
    <abp-input asp-for="UserName" />
    <abp-input asp-for="Name" />
    <abp-input asp-for="Surname" />
    <abp-input asp-for="Email" />
    <abp-input asp-for="PhoneNumber" />

    <div class="mb-3">
        <label class="form-label" for="MiddleName">Middle name</label>
        <input id="MiddleName"
               class="form-control"
               type="text"
               value="@(Model.GetProperty<string>("MiddleName"))" />
    </div>

    <abp-button type="submit" button-type="Primary" text="Save" />
</form>

2) JavaScript (send normal fields + ExtraProperties)

(function ($) {
  $(function () {
    var _profileService = volo.abp.account.profile;

    $("#MyPersonalSettingsForm").submit(function (e) {
      e.preventDefault();

      if (!$("#MyPersonalSettingsForm").valid()) {
        return false;
      }

      // Collect normal fields from form inputs (UserName, Name, Surname, Email, PhoneNumber...)
      var input = $("#MyPersonalSettingsForm").serializeFormToObject();

      // Add custom fields into ExtraProperties
      input.ExtraProperties = {
        MiddleName: $("#MiddleName").val()
      };

      _profileService.update(input).then(function () {
        abp.notify.success("Saved");
      });
    });
  });
})(jQuery);

3) Required server-side mapping for saving ExtraProperties

In a tiered solution, add (once) in your AuthServer (or HttpApi.Host, wherever ProfileAppService runs) module:

ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi(
    IdentityModuleExtensionConsts.ModuleName,
    IdentityModuleExtensionConsts.EntityNames.User,
    getApiTypes: new[] { typeof(ProfileDto) },
    updateApiTypes: new[] { typeof(UpdateProfileDto) }
);

Otherwise UpdateProfileDto.ExtraProperties reaches the API but won’t be applied to the user entity.

  • https://abp.io/support/questions/3517
  • https://abp.io/docs/10.2/framework/fundamentals/object-extensions

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.

  • Extend AbpUsers (add new profile fields)
    1. Define the extra properties in your *.Domain.Shared module extension configurator:
// YourProjectNameModuleExtensionConfigurator.cs (Domain.Shared)
     using Volo.Abp.ObjectExtending;

     public static class YourProjectNameModuleExtensionConfigurator
     {
         private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();

         public static void Configure()
         {
             OneTimeRunner.Run(() =>
             {
                 ObjectExtensionManager.Instance.Modules().ConfigureIdentity(identity =>
                 {
                     identity.ConfigureUser(user =>
                     {
                         user.AddOrUpdateProperty<string>("MiddleName");
                         user.AddOrUpdateProperty<string>("MyCustomField1");
                         // add as many as you need (with attributes if you want)
                     });
                 });
             });
         }
     }
  1. Map them to real columns on AbpUsers in your EF Core project (so SQL Server has physical columns):
// YourProjectNameEfCoreEntityExtensionMappings.cs (EntityFrameworkCore project)
     using Volo.Abp.Identity;
     using Volo.Abp.ObjectExtending;
     using Volo.Abp.Threading;

     public static class YourProjectNameEfCoreEntityExtensionMappings
     {
         private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();

         public static void Configure()
         {
             OneTimeRunner.Run(() =>
             {
                 ObjectExtensionManager.Instance
                     .MapEfCoreProperty<IdentityUser, string>("MiddleName")
                     .MapEfCoreProperty<IdentityUser, string>("MyCustomField1");
             });
         }
     }
  1. Create and apply the migration (then run DbMigrator) so the new columns are created in SQL Server.
  • Remove/hide built-in fields like Surname

    • ABP’s IdentityUser has built-in fields (like Surname). Removing the property from the entity is not supported (it’s part of the module contract), but you can:
      • Stop collecting it in UI (hide/remove it from forms).
      • Optionally ignore it in your business rules (leave it empty).
    • For the My Profile UI specifically, you can remove the default Personal Info tab and replace it with your own (next section), so you don’t show Surname at all.
  • Collect new fields in a new tab in “My Profile” (MVC)

    1. Add a contributor that adds a new tab (group) and optionally removes the built-in Personal Info tab:
using System.Threading.Tasks;
     using Volo.Abp.Account.Public.Web.ProfileManagement;
     using Volo.Abp.DependencyInjection;

     public class MyProfileManagementPageContributor : IProfileManagementPageContributor, ITransientDependency
     {
         public Task ConfigureAsync(ProfileManagementPageCreationContext context)
         {
             // Optional: remove the built-in personal info group (so you fully replace it)
             context.Groups.RemoveAll(x => x.Id == "Volo-Abp-Account-PersonalInfo");

             // Add your custom tab
             context.Groups.Add(
                 new ProfileManagementPageGroup(
                     "my-custom-profile",
                     "My Profile (Custom)",
                     typeof(MyCustomProfileManagementGroupViewComponent)
                 )
             );

             return Task.CompletedTask;
         }
     }
  1. Implement the ViewComponent and its view (your form). You can call IProfileAppService.GetAsync() to get ProfileDto and use ExtraProperties for your added fields.
using System.Threading.Tasks;
     using Microsoft.AspNetCore.Mvc;
     using Volo.Abp.Account;
     using Volo.Abp.AspNetCore.Mvc;

     public class MyCustomProfileManagementGroupViewComponent : AbpViewComponent
     {
         private readonly IProfileAppService _profileAppService;

         public MyCustomProfileManagementGroupViewComponent(IProfileAppService profileAppService)
         {
             _profileAppService = profileAppService;
         }

         public virtual async Task<IViewComponentResult> InvokeAsync()
         {
             var profile = await _profileAppService.GetAsync();
             return View("~/Pages/Account/Components/MyCustomProfile/Default.cshtml", profile);
         }
     }
  1. Register the contributor:
using Volo.Abp.Account.Public.Web.ProfileManagement;
     using Volo.Abp.Modularity;

     [DependsOn(/* your web module deps */)]
     public class YourProjectNameWebModule : AbpModule
     {
         public override void ConfigureServices(ServiceConfigurationContext context)
         {
             Configure<ProfileManagementPageOptions>(options =>
             {
                 options.Contributors.Add(new MyProfileManagementPageContributor());
             });
         }
     }
  1. Important for saving extra fields from “My Profile” (so UpdateProfileDto.ExtraProperties is actually applied): Add this mapping (commonly done in your AuthServer or HttpApi.Host module in tiered solutions):
using Volo.Abp.Identity;
     using Volo.Abp.ObjectExtending;
     using Volo.Abp.Threading;

     public class YourProjectNameAuthServerModule : AbpModule
     {
         private static readonly OneTimeRunner OneTimeRunner = new OneTimeRunner();

         public override void PostConfigureServices(ServiceConfigurationContext context)
         {
             OneTimeRunner.Run(() =>
             {
                 ModuleExtensionConfigurationHelper.ApplyEntityConfigurationToApi(
                     IdentityModuleExtensionConsts.ModuleName,
                     IdentityModuleExtensionConsts.EntityNames.User,
                     getApiTypes: new[] { typeof(ProfileDto) },
                     updateApiTypes: new[] { typeof(UpdateProfileDto) }
                 );
             });
         }
     }
 Then in your custom tab’s JS/form post, send:
 - normal fields (`Name`, `UserName`, etc.)
 - `ExtraProperties` with your new fields (e.g., `MiddleName`)

Sources:

  • https://abp.io/docs/latest/Customizing-Application-Modules-Extending-Entities
  • https://abp.io/community/articles/rixchoha
  • https://abp.io/support/questions/3517
  • https://abp.io/docs/latest/framework/architecture/modularity/basics

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 Server + LeptonX, the FOUC you saw is typically caused by theme-appearance/theme CSS being applied only after the Blazor circuit starts and LeptonX determines the active appearance (light/dark/system). Adding <leptonx-theme-appearance /> fixes the FOUC by applying appearance early, but it can also produce a brief black screen because the page background/appearance is set immediately (often to dark) before the rest of the UI/LeptonX layout finishes rendering under slow networks.

  • The practical way to avoid both effects is to make the initial HTML render with a stable background + minimal critical CSS, so the browser never shows an unstyled/incorrect theme, and it never shows a black blank page either.

What to do (Blazor Server, ABP 9.1.3, LeptonX)

  1. Keep using <leptonx-theme-appearance /> (it’s the correct direction to prevent late theme injection/FOUC).

  2. Add a tiny “critical” inline style (or a very small local CSS loaded before everything else) that:

    • sets html, body background to the expected color (or at least a neutral non-black color),
    • hides the app root until LeptonX appearance is applied, but shows a lightweight placeholder/skeleton instead of a black screen.

    Conceptually:

    • show a placeholder immediately (fast paint),
    • once the theme/appearance class/attribute is applied, reveal the real app.
  3. Ensure your LeptonX/ABP global CSS bundle is emitted as early as possible in the host page (_Host.cshtml / layout). In ABP, this is normally done via the theme’s recommended AbpStyles bundle usage (per the LeptonX Blazor doc). If you’ve customized the host markup, revert to the recommended placement so styles are in <head> and not deferred.

  4. If the “black screen” is specifically because the appearance resolves to dark on first load under throttling, set a deterministic default appearance (e.g., Light) instead of “System”, or persist the user preference and apply it immediately. (This prevents an initial “dark background” paint on devices where system preference is dark.)

Has it been improved in newer versions?

No verified source available that explicitly states this specific FOUC vs black-screen behavior was fixed in a particular ABP/LeptonX version. The only verified guidance available is the general LeptonX Blazor integration approach and the known “late styles” discussion you already found.

Links (validated):

  • https://abp.io/support/questions/4809/Stylesheets-are-loaded-very-late
  • https://abp.io/docs/latest/ui-themes/lepton-x/blazor

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.

  • Add a project reference from the new MVC UI project (e.g., MyCompany.PublicWeb) to the existing MyCompany.HttpApi.Client project:
<!-- MyCompany.PublicWeb.csproj -->
<ItemGroup>
  <ProjectReference Include="..\..\src\MyCompany.HttpApi.Client\MyCompany.HttpApi.Client.csproj" />
</ItemGroup>
  • Then depend on the HttpApi.Client module in your new UI module class, so ABP registers the generated/typed client proxies:
using Volo.Abp.Modularity;
using MyCompany.HttpApi.Client;

namespace MyCompany.PublicWeb;

[DependsOn(
    typeof(MyCompanyHttpApiClientModule) // this is the key
)]
public class MyCompanyPublicWebModule : AbpModule
{
}
  • Ensure your new UI has the backend base URL configured (so proxies know where to call):
// appsettings.json (MyCompany.PublicWeb)
{
  "RemoteServices": {
    "Default": {
      "BaseUrl": "https://localhost:44300"
    }
  }
}
  • After that, you can inject your application service interfaces (from MyCompany.Application.Contracts) directly in MVC controllers/pages and ABP will call the existing HttpApi.Host through the proxy:
public class HomeController : Controller
{
    private readonly IMyAppService _myAppService;

    public HomeController(IMyAppService myAppService)
    {
        _myAppService = myAppService;
    }
}

Links (verified):

  • https://abp.io/docs/10.2/framework/api-development/dynamic-csharp-clients
  • https://abp.io/docs/10.2/framework/api-development/static-csharp-clients

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 a tiered ABP solution, *.Web is an OpenID Connect client of *.AuthServer and calls *.HttpApi.Host with the access token. To add an additional *.Web-like MVC UI that reuses the same AuthServer and HttpApi.Host, you essentially clone the existing Web app pattern: create a new MVC host project/module, set its OIDC client settings to your existing AuthServer, and set its RemoteServices base URL to your existing HttpApi.Host.

1) Add a new MVC UI host project (e.g., MyCompany.PublicWeb)

  1. Create a new ASP.NET Core MVC host project in your solution (recommended naming examples):
    • MyCompany.PublicWeb (or MyCompany.Web.Public, MyCompany.CorporateWeb, etc.)
  2. Reference the same “Web” layer modules your existing MyCompany.Web uses (typical references):
    • MyCompany.HttpApi.Client (so you can call the existing HttpApi.Host)
    • MyCompany.Web-equivalent shared UI module(s) if you have them (optional, depends on how you organized UI code)
  3. Add a Web module class (pattern is the same as your existing *.Web module) and depend on ABP MVC UI modules + your app modules.

2) Configure the new UI to use the existing AuthServer (OpenID Connect)

In MyCompany.PublicWeb/appsettings.json, point to the existing AuthServer:

{
  "AuthServer": {
    "Authority": "https://localhost:44301",
    "RequireHttpsMetadata": "false"
  },
  "App": {
    "SelfUrl": "https://localhost:44305"
  }
}

Then configure OIDC client settings similarly to your existing *.Web project (same approach, different client id / redirect URL).

3) Register a new OIDC client in the existing AuthServer for the new Web app

In your existing tiered solution’s *.AuthServer, you must register a new client for this new UI (new ClientId, redirect URIs, post-logout redirect URIs), matching the new app’s URL:

  • Redirect URI example: https://localhost:44305/signin-oidc
  • Post logout callback: https://localhost:44305/signout-callback-oidc

(How you register it depends on your solution’s seeding approach, but it must be done in the AuthServer side.)

4) Configure the new UI to call the existing HttpApi.Host (RemoteServices)

In MyCompany.PublicWeb/appsettings.json set the RemoteServices base URL to your existing HttpApi.Host:

{
  "RemoteServices": {
    "Default": {
      "BaseUrl": "https://localhost:44300"
    }
  }
}

Then ensure the new UI project references/depends on MyCompany.HttpApi.Client so it can use ABP’s generated/typed client proxies to call the existing backend.

5) Theme: use Basic theme (or your corporate layout) in the new Web app

If you don’t want LeptonX in the additional UI, use ABP MVC theming/bundling:

  • Start with Basic theme and override layouts / add your corporate CSS/JS via bundling.
  • ABP will allow overriding theme files by placing the same paths in your UI project (Virtual File System override behavior).

6) Run

Start these 3 apps together:

  • MyCompany.AuthServer
  • MyCompany.HttpApi.Host
  • MyCompany.PublicWeb (your additional MVC UI)

Your new UI will authenticate against the existing AuthServer and call the existing HttpApi.Host, just like the original *.Web.


Sources

  • https://abp.io/docs/10.2/suite/solution-structure
  • https://abp.io/docs/10.2/framework/ui/mvc-razor-pages/theming

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.

Showing 331 to 340 of 1374 entries
Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.8.0-preview. Updated on October 21, 2026, 11:09
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.