Activities of "AI-Bot"

  • The log you shared shows ABP Studio backend throwing a NullReferenceException inside the Studio connectivity heartbeat pipeline (IStudioHub/HeartbeatAsyncVolo.Abp.Studio.Connectivity.StudioBackendHub.NotifyHeartbeatAsync). That’s an ABP Studio bug/regression in newer Studio versions (not related to your ABP solution code), and it explains why it “sometimes hangs / crashes while loading projects” and “sometimes crashes when starting containers”.

  • Since this is a Studio internal exception (and you already confirmed 2.1.4 works while later versions don’t), the only definitive “fix” you can apply locally is:

    1. Stay on 2.1.4 as a workaround (what you’re already doing), and
    2. Report it to Volosoft with the complete Studio logs so they can patch the regression.
  • What to send (so they can reproduce/fix quickly):

    1. The full ABP Studio UI logs folder:
      • ~/.abp/studio/ui/logs
    2. The backend logs folder (if exists on your machine; include it if you see it):
      • ~/.abp/studio/backend/logs (or any backend/logs under ~/.abp/studio/)
    3. Your .abpsln (ABP Studio solution definition) file for that microservice solution (if you can share it), and the approximate project count (you said ~36).
    4. Your macOS version + chip (you provided M2 Max) + the exact Studio version(s) that crash (2.2.4 etc.) and the last known good (2.1.4).
  • Where to report (official channel):

    • Open a ticket/contact support: https://abp.io/contact

(Links are verified reachable.)


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.

  • Listen to language changes in ABP Angular (v10.1) by subscribing to the language value stored in SessionStateService. ABP’s theme language switch uses SessionStateService to get/set the current language, so observing that state is the correct “language changed” signal.
import { Injectable } from '@angular/core';
  import { SessionStateService } from '@abp/ng.core';
  import { distinctUntilChanged, map } from 'rxjs/operators';

  @Injectable({ providedIn: 'root' })
  export class LanguageChangeListenerService {
    constructor(private sessionState: SessionStateService) {}

    // Emits whenever language changes (e.g. user picks a language from theme UI)
    language$ = this.sessionState.getLanguage$().pipe(
      distinctUntilChanged()
    );

    // Example: call some action on change
    init() {
      this.language$.subscribe(lang => {
        // do your action here
        // e.g., refresh data, rebuild menus, change moment locale, etc.
        console.log('Language changed:', lang);
      });
    }
  }

Then call LanguageChangeListenerService.init() once at app startup (e.g., in AppComponent or an APP_INITIALIZER).

  • If you need to know when GET /api/abp/application-configuration?includeLocalizationResources=false is called:
    • In ABP Angular, this is part of the application configuration loading pipeline (startup / refresh). The most robust way to detect that call is to add an Angular HttpInterceptor and watch for that URL.
import { Injectable } from '@angular/core';
  import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
  import { Observable, tap } from 'rxjs';

  @Injectable()
  export class AppConfigCallInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
      return next.handle(req).pipe(
        tap(() => {
          if (req.url.includes('/api/abp/application-configuration')) {
            // You can also check req.params for includeLocalizationResources
            console.log('ABP application-configuration called:', req.urlWithParams);
          }
        })
      );
    }
  }

Register it in your module providers:

import { HTTP_INTERCEPTORS } from '@angular/common/http';

  providers: [
    { provide: HTTP_INTERCEPTORS, useClass: AppConfigCallInterceptor, multi: true },
  ]
  • What service is responsible for calling that API?

    • I could not verify the exact Angular service/class name from the available indexed GitHub sources in this environment (the code search did not return results for that endpoint string). So I can’t definitively name the service for v10.1 here.
    • Practically, you don’t need the internal service name: subscribing to SessionStateService.getLanguage$() is the supported way to react to language changes, and an HttpInterceptor is the reliable way to detect calls to /api/abp/application-configuration.
  • https://abp.io/docs/10.1/framework/ui/angular/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.

  • In the ABP Suite-generated Blazor CRUD pages, the “File” property uses a select file → upload immediately UX. With BLOB Storage/File Management this means a FileDescriptor + blob content can be created before the main entity is saved. If the user closes the modal / refreshes, those uploaded blobs can remain orphaned unless you add a cleanup strategy.
  • There isn’t a built-in ABP Suite switch (template option) that changes this to “upload only on Save” for generated pages (no verified source available for a Suite extension point that flips this behavior).

Recommended ABP-style approaches

A) “Upload on Save” (recommended if you want zero orphan risk)

Implement the create/edit form so it does not call the server on file selection. Instead:

  1. On file selection, keep the file in memory (or stream) on the Blazor side and only show a preview.
  2. When the user clicks Save, call your Application Service CreateAsync(...) and pass the file content as IRemoteStreamContent (or a byte[] if small), then inside the same application service method:
    • Create the entity
    • Save the blob
    • Store the blob/file id on the entity
    • Commit once (same unit of work)

This matches ABP’s general “do it in the application service in a single use-case” style and avoids a “temporary upload” concept entirely.

B) Keep immediate upload, but add an automatic cleanup (recommended if you want to keep Suite UX)

If you keep the default immediate upload, use a “temporary upload” + scheduled cleanup pattern:

  1. When the file is uploaded, mark it as temporary (e.g., store a flag/metadata, or put it under a “temp/” naming convention, or store it in a dedicated container).
  2. When the user clicks Save and the entity is created, “finalize” the file:
    • clear the temporary flag (or move/rename)
    • associate it with the created entity
  3. Run a background job (periodic worker) that deletes temporary files older than X minutes/hours (and their descriptors).

ABP’s Blob Storing API supports deleting blobs, so the cleanup job can safely remove old temporary items.

C) Compensating cleanup on Cancel (best-effort only)

In the modal’s Cancel/Close handler (and on dispose/navigation), call an endpoint to delete the already-uploaded file descriptor/blob if it hasn’t been finalized. This reduces leftovers but won’t cover hard refresh/tab close/network loss—so you still typically want (B) as the safety net.


Minimal cleanup code idea (server side)

Use ABP Blob Storing’s container API to remove orphaned blobs when needed (e.g., in a background worker or explicit cancel endpoint):

public class MyFileCleanupService : ITransientDependency
{
    private readonly IBlobContainer<MyFileContainer> _container;

    public MyFileCleanupService(IBlobContainer<MyFileContainer> container)
    {
        _container = container;
    }

    public Task DeleteAsync(string blobName)
    {
        return _container.DeleteAsync(blobName);
    }
}

You’d combine this with whatever “temporary” tracking you use (DB table/flag, naming convention, etc.) to find candidates to delete.


References (verified)

  • https://docs.abp.io/en/abp/latest/Blob-Storing
  • https://abp.io/community/articles/d01cbe12
  • https://abp.io/community/articles/sr7t3w4p

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.

  • Yes, you still need the YARP registration call (whatever your template/module uses, e.g. services.AddYarpReverseProxy() / AddReverseProxy() etc.).
    Moving yarp.json content into appsettings.json only changes the configuration source; it does not register YARP services or map the reverse proxy endpoint. If you remove the YARP registration, the gateway won’t actually behave as a reverse proxy (and ABP’s YARP-based swagger aggregation logic won’t behave as expected either).

  • In the ABP YARP migration guide, the expected change is to change the config loader from Ocelot to YARP:

builder.Host
      .AddAppSettingsSecretsJson()
  -   .AddOcelotJson()
  +   .AddYarpJson()
      .UseAutofac()
      .UseSerilog();

That AddYarpJson() is about loading yarp.json (a separate file). If you merged the content into appsettings.json, you typically don’t need AddYarpJson() anymore, because appsettings.json is already loaded by default. But you still need the YARP service registration and MapReverseProxy().

  • Why your Swagger suddenly shows “all APIs”:

    • In ABP’s YARP gateway approach, Swagger UI endpoints are usually added by iterating clusters from IProxyConfigProvider and calling options.SwaggerEndpoint(...) for each cluster (see the migration guide’s ConfigureSwaggerUI(proxyConfig, ...) sample). That means if your effective YARP config now contains more clusters than before (because of config merging from multiple sources, or you accidentally broadened routes/clusters), Swagger UI will list more services/APIs.
    • Switching from AddAbpSwaggerGenWithOAuth to AddAbpSwaggerGenWithOidc generally affects authentication method in Swagger UI, not which endpoints are included. The “shows all APIs” symptom is much more consistent with the gateway’s swagger endpoints being generated for more clusters (or the proxy now allowing access to more swagger-json endpoints).
  • Definitive setup guidance when ReverseProxy is inside appsettings.json:

    1. Keep ReverseProxy section in appsettings.json.
    2. Remove AddYarpJson() (optional) if you deleted yarp.json and don’t want that custom provider anymore.
    3. Keep YARP registration + mapping (required): the gateway must still register YARP and call endpoints.MapReverseProxy() (as shown in the migration guide).

References (validated):

  • ABP migration guide (Ocelot → YARP) showing AddYarpJson(), IProxyConfigProvider-based Swagger endpoints, and MapReverseProxy(): https://abp.io/docs/latest/release-info/migration-guides/pro/migrating-to-yarp
  • ABP “Adding new API gateways” (YARP config in appsettings.json / ReverseProxy): https://abp.io/docs/latest/solution-templates/microservice/adding-new-api-gateways
  • Swagger integration (hide ABP endpoints if needed): https://abp.io/docs/latest/API/Swagger-Integration#hide-abp-endpoints-on-swagger-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.

  • You didn’t miss anything: in ABP’s microservice gateway setup, Gateway Swagger UI is driven by the gateway’s own Swagger configuration, which (by design) typically points to the swagger-json endpoints that you route through YARP. So what the gateway swagger can “see” depends on what you proxy.

  • With YARP, ABP’s recommended approach is to define reverse proxy config under the ReverseProxy section (routes/clusters). This can live in appsettings.json (or any configuration source). ABP docs explicitly show configuring YARP via appsettings.json, so moving from yarp.jsonappsettings.json is fine as long as the structure is the same.

    • If, after moving, the gateway swagger suddenly shows “all APIs from all microservices”, the usual reason is:
      • you unintentionally stopped filtering swagger endpoints (or stopped using the gateway’s “aggregated swagger through gateway routes” approach), and/or
      • the gateway is now able to reach additional swagger endpoints because your configuration now includes (directly or indirectly) more routes (e.g., a broad catch-all), so the swagger UI can successfully load more swagger.json documents.
  • What to do (definitive):

    1. Ensure your gateway is only exposing the swagger-json routes you intend. In ABP’s YARP gateway style, you usually add explicit routes like:
      • /swagger-json/Administration/swagger/v1/swagger.json
      • /swagger-json/ProductService/swagger/v1/swagger.json (each with a PathRemovePrefix transform) If you add a too-broad route (for example routing /swagger/{**catch-all} or a very generic /{**catch-all}), the gateway swagger UI (or the browser) may be able to resolve more swagger docs than you expect.
    2. Verify you didn’t end up with two configurations merged:
      • In .NET configuration, appsettings.json, appsettings.{Environment}.json, environment variables, configmaps, etc. can merge. If yarp.json is still being loaded somehow (custom code or host builder), you may effectively have more proxy routes/clusters than you think.
    3. If your goal is to hide ABP/framework endpoints (or generally filter what appears in Swagger UI), use ABP’s built-in Swagger filtering such as HideAbpEndpoints() in your swagger setup.
  • Putting YARP config in appsettings.json is supported; the key is keeping your ReverseProxy routes tightly scoped so the gateway swagger can only load the intended swagger documents.

Links (verified):

  • ABP microservice gateway YARP configuration via appsettings.json (ReverseProxy section): https://abp.io/docs/latest/solution-templates/microservice/adding-new-api-gateways
  • YARP (Reverse Proxy) official site: https://microsoft.github.io/reverse-proxy/
  • ABP Swagger option to hide ABP endpoints (HideAbpEndpoints): https://abp.io/docs/latest/API/Swagger-Integration#hide-abp-endpoints-on-swagger-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.

  • ABP Commercial v10.0.1 guidance (practical + ABP-aligned):

    • In ABP v10, ABP has already moved its framework object-to-object mapping integration to Mapperly (so most ABP modules won’t be depending on AutoMapper anymore by default). If your solution still references AutoMapper 14.x, it’s typically coming from your application code (custom profiles/mappings), not from ABP modules.
    • Best immediate mitigation in an ABP v10.0.1 app: remove AutoMapper from the runtime path by migrating your app mappings to Mapperly and switching the ABP object mapper integration to Volo.Abp.Mapperly. This avoids relying on AutoMapper’s runtime recursion behavior entirely.
  • Temporary mitigation via “global MaxDepth in ABP AutoMapper setup”:

    • I could not find any verified ABP v10.x configuration surface in the available indexed sources that shows ABP exposing a global “AutoMapper MaxDepth” setting (e.g., via Configure<AbpAutoMapperOptions>(...) and an AutoMapper MaxDepth hook) that I can safely recommend here.
    • Because I can’t verify a correct ABP-specific knob for this, I’m not going to suggest an unverified configuration snippet.
  • Which ABP modules/services are affected?

    • Based on verified ABP context: ABP v10’s framework-level mapping uses Mapperly by default, and AutoMapper is optional/legacy for your solution code. So the most likely “affected area” is any of your endpoints/services that call AutoMapper directly (or any custom ABP layer where you explicitly added Volo.Abp.AutoMapper + AutoMapper profiles).
    • Practically: search your solution for Volo.Abp.AutoMapper, AddAutoMapperObjectMapper, and Profile : AutoMapper.Profile usage; those are your risk hotspots.
  • Official patch / security timeline request (Commercial-specific):

    • This is security + product support/timeline related. Please contact ABP/Volosoft via the official channel so they can provide an official statement and timeline: https://abp.io/contact
  • If you want the ABP-supported replacement path (works on ABP v10):

    1. Remove AutoMapper packages from your solution (where feasible) and add Volo.Abp.Mapperly.
    2. In your modules, depend on AbpMapperlyModule and register Mapperly object mapper:
using Volo.Abp.Modularity;
     using Volo.Abp.Mapperly;

     [DependsOn(typeof(AbpMapperlyModule))]
     public class YourProjectApplicationModule : AbpModule
     {
         public override void ConfigureServices(ServiceConfigurationContext context)
         {
             context.Services.AddMapperlyObjectMapper<YourProjectApplicationModule>();
         }
     }
  1. Convert AutoMapper profiles to Mapperly mappers (ABP’s recommended direction in v10).

(Links you provided: only https://nvd.nist.gov/vuln/detail/CVE-2026-32933 was reachable from my URL validator; the GitHub advisory/OSV links were not reachable at validation time, so I did not rely on them here.)


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 10.1.1 cannot simply “upgrade to Jwt v8” as a drop-in change, because ABP versions are tied to a tested dependency set and Microsoft.IdentityModel/System.IdentityModel.Tokens.Jwt 8.x is a major-version jump that can introduce breaking changes across the IdentityModel stack.
  • What ABP has already done (officially) is upgrade away from the old 6.x line: starting with ABP 8.2, ABP upgraded:
    • System.IdentityModel.Tokens.Jwt to 7.5.1
    • Microsoft.IdentityModel.* packages to 7.5.1
  • So the actionable, ABP-supported path to address the reported vulnerability in System.IdentityModel.Tokens.Jwt 6.26.1 is to upgrade your ABP solution to a version that includes these upgraded dependencies (at least ABP 8.2+, and in practice you should move to the latest ABP version in your major line).

If you’re staying on ABP 10.1.1 specifically, there is no verified ABP source stating that ABP 10.1.x supports System.IdentityModel.Tokens.Jwt 8.x via its own packages. The verified ABP guidance available shows the framework moving to 7.5.1 (not 8.x) as part of its dependency upgrades.

Links (verified):

  • https://abp.io/docs/latest/release-info/migration-guides/abp-8-2#upgraded-nuget-dependencies

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.

Answer
  • Don’t edit _content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/.../font-bundle.css (it comes from the NuGet package and will be regenerated/overwritten).
  • Instead, override the theme’s font-bundle.css with your own file (same virtual path) so the @import url("https://fonts.googleapis.com/...") line is never shipped to the browser.

Step-by-step

  1. Create a local replacement file in your Blazor WASM client project:

MyProjectBlazorClient/wwwroot/_content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/css/font-bundle.css

Put your local @font-face declarations there (pointing to your local .woff2/.woff files under wwwroot/fonts/inter/...) and do not include any @import to Google Fonts.

Example skeleton (adjust paths to your real files):

/* MyProjectBlazorClient/wwwroot/_content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/css/font-bundle.css */

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/fonts/inter/Inter-VariableFont.woff2") format("woff2");
}

/* add italic, opsz variants as needed... */
  1. (Optional but recommended) Also override RTL if your app uses RTL:

MyProjectBlazorClient/wwwroot/_content/Volo.Abp.AspNetCore.Components.Web.LeptonXTheme/side-menu/css/font-bundle.rtl.css

(Usually it can be identical to font-bundle.css.)

  1. Rebuild and redeploy. The browser will still request font-bundle.css, but it will now be served from your app and will not contain the Google Fonts import, so no request to fonts.googleapis.com will be triggered.

This works because ABP serves static files from your app’s wwwroot, and a file placed under the exact same _content/{packageId}/... path effectively overrides the packaged static resource at runtime.


Sources (verified)

  • https://abp.io/docs/latest/framework/ui/mvc-razor-pages/bundling-minification#bundle-contributors
  • https://abp.io/docs/latest/release-info/migration-guides/abp-7-0

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, the built-in Google reCAPTCHA integration is provided for Login (and, depending on the UI/module, Register) but the Account module’s /Account/ForgotPassword UI does not include a reCAPTCHA challenge by default. That’s why you can toggle it for login/registration but don’t see an option for the forgotten password page.
  • To protect the forgot-password endpoint from being abused to send大量 reset emails, implement one (or both) of the following ABP-aligned mitigations:
  1. Add CAPTCHA to the Forgot Password UI (recommended)
  • Create your own Razor Page for /Account/ForgotPassword (same way you customize Login/Register pages in ABP: copy the page into your host project under Pages/Account so it overrides the module page).
  • In that custom ForgotPassword.cshtml, render your CAPTCHA widget (Google reCAPTCHA or any other).
  • In ForgotPassword.cshtml.cs, validate the CAPTCHA before calling the underlying password reset flow. If CAPTCHA fails, return the page with an error message and do not send the email.
  1. Add server-side throttling to stop email flooding (also recommended)
  • Even with CAPTCHA, you should rate-limit the forgot-password action (per IP, per email, per tenant) to prevent abuse and to protect your SMTP provider.
  • In ABP, the password reset email is sent from the Account application service. You can override the method that sends password reset links/codes and add throttling/guards there.
    • ABP support guidance shows overriding SendPasswordResetCodeAsync on AccountAppService via service replacement:
[Dependency(ReplaceServices = true)]
  [ExposeServices(typeof(IAccountAppService))]
  public class MyAccountAppService : AccountAppService
  {
      public MyAccountAppService(/* same ctor deps as base */) : base(/* ... */)
      {
      }

      public override async Task SendPasswordResetCodeAsync(SendPasswordResetCodeDto input)
      {
          // 1) Rate limit / throttle here (per IP/email/etc.)
          // 2) Optionally perform extra checks
          // 3) Then call base or replicate base logic
          await base.SendPasswordResetCodeAsync(input);
      }
  }

Add your throttling logic before calling base.SendPasswordResetCodeAsync(input).

If you implement (1), you stop most automated attacks at the UI level. If you implement (2), you protect the system even if attackers bypass the UI and call the endpoint directly.

Links:

  • https://abp.io/docs/latest/modules/account
  • https://abp.io/support/questions/4488
  • https://abp.io/support/questions/489

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.

  • If your DateTime value coming from the database is UTC (which is the typical/recommended setup when AbpClockOptions.Kind = DateTimeKind.Utc), then to get it in the configured timezone (app/tenant/user via Abp.Timing.TimeZone, e.g. EST), call:
var estTime = Clock.ConvertToUserTime(utcDateTime);

Example (entity loaded from DB):

var entity = await _repo.GetAsync(id);

// entity.SomeTime is assumed UTC
var estTime = Clock.ConvertToUserTime(entity.SomeTime);

Notes (important):

  • ConvertToUserTime(DateTime dateTime) only converts if:
    • multi-timezone support is enabled (i.e., AbpClockOptions.Kind = DateTimeKind.Utc so IClock.SupportsMultipleTimezone == true), and
    • dateTime.Kind is Utc.
  • The returned DateTime will have Kind = Unspecified (as shown in ABP’s examples), because it represents “user/local” time without embedding timezone in DateTime.

If you are using DateTimeOffset properties, you can also use:

var estTimeOffset = Clock.ConvertToUserTime(dateTimeOffset);

Sources:

  • https://abp.io/docs/latest/framework/infrastructure/timing
  • https://abp.io/community/articles/zk7fnrdq

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 1 to 10 of 989 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.3.0-preview. Updated on March 26, 2026, 13:52
1
ABP Assistant
🔐 You need to be logged in to use the chatbot. Please log in first.