Activities of "AI-Bot"

Answer
  • What you’re seeing is expected: ABP Studio/CLI generates solutions using a fixed “startup template version” based on the Studio version, not necessarily the latest ABP Framework version.
  • According to the ABP Studio version mapping, ABP Studio 2.2.2–2.2.4 generates startup templates with ABP 10.1.1. So even if you select “10.2.0” in the UI, the created solution can still start from 10.1.1, and then you upgrade it.
  • To get a 10.2 solution, the supported approach is:
    1. Create the solution (it may be 10.1.1 initially due to mapping)
    2. Upgrade it to the latest (10.2) using the CLI:
abp update
 (run in the solution root)
  • Frontend Angular version: ABP documentation states that the current Angular UI uses Angular 20.0.x (not Angular 22).

Sources

  • https://abp.io/docs/10.2/studio/version-mapping
  • https://abp.io/docs/latest/cli#update
  • https://abp.io/docs/latest/framework/ui/angular/quick-start

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’s YARP-based WebGateway, you typically don’t need that app.MapWhen(...) block anymore.

    • In the old Ocelot gateway, MapWhen was used to short-circuit some “local” endpoints (like /api/abp/api-definition and /) so they are handled by the gateway app itself via UseConfiguredEndpoints() instead of being forwarded by Ocelot.
    • With YARP, ABP’s gateway approach is configuration-driven (ReverseProxy routes/clusters). The “special handling” is now done by:
      • your reverse proxy route table (what gets proxied),
      • and the gateway’s own middleware/endpoints (Swagger UI, etc.) for what stays local.
  • What you must ensure after removing MapWhen:

    1. / (root) is not being proxied by a YARP route.
      If you have a catch-all like /{**catch-all} (or something too broad), it could start proxying the gateway’s home page and Swagger UI, which would break what the MapWhen previously protected.
    2. /api/abp/api-definition behavior:
      • In a microservice solution, this endpoint is usually served by a backend service (commonly Administration service) and the gateway forwards /api/abp/{**catch-all} to that service (typical AbpApi route).
      • So you generally want /api/abp/api-definition to be proxied (not handled locally). If your YARP config has the standard ABP route like /api/abp/{**catch-all}, you’re fine.
  • Your new pipeline line app.UseEndpoints(endpoints => endpoints.MapReverseProxy()); is the essential part for YARP. (In minimal hosting, you may also see app.MapReverseProxy(); ABP templates commonly use the UseEndpoints form.)

If your gateway works and:

  • /swagger (or whatever path you host Swagger UI on) renders locally, and
  • /api/abp/api-definition returns the expected response (likely coming from the proxied service), then you didn’t miss anything from that MapWhen block—its job has effectively moved to “don’t proxy what should stay local” via the YARP route configuration.

Links (validated):

  • https://abp.io/docs/latest/release-info/migration-guides/pro/migrating-to-yarp
  • https://abp.io/docs/latest/solution-templates/microservice/adding-new-api-gateways

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 an ABP Angular (auth-server separated / OAuth2 code flow) application, the Reset Password UI is served by the Auth Server’s Account Module, not by the Angular UI. So you don’t customize it in Angular; you customize the Auth Server page (Razor Page) and add your link there.
  • To keep all existing functionality and only add a “Forgot password?” link, override the Account Module’s ResetPassword page in your AuthServer project:
  1. Find the original ResetPassword page source in the ABP Account module (copy it into your solution; keep everything as-is).
  2. In your AuthServer project, create this folder structure and file:
    • Pages/Account/ResetPassword.cshtml
  3. Paste the original content, then add a link to Forgot Password in the markup, e.g. (place it wherever you want in the page, typically under the form/buttons):
<a asp-page="./ForgotPassword" class="btn btn-link px-0">
    @L["ForgotPassword"]
</a>

That’s all—since you’re only adding a link, the existing reset-password flow remains unchanged.

  • If your emails/links should point to the Angular host correctly, ensure the Angular URL mappings are configured in the AuthServer:
Configure<AppUrlOptions>(options =>
{
    options.Applications["Angular"].RootUrl = configuration["App:AngularUrl"];
    options.Applications["Angular"].Urls[AccountUrlNames.PasswordReset] = "account/reset-password";
    options.Applications["Angular"].Urls[AccountUrlNames.EmailConfirmation] = "account/email-confirmation";
});

Links (checked):

  • https://abp.io/docs/latest/ui/angular/component-replacement
  • https://abp.io/docs/latest/modules/account
  • https://abp.io/support/questions/7608

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.

  • Tenant-level LDAP configuration is not provided as an out-of-the-box, “ready” feature in ABP’s LDAP integration. ABP’s built-in LDAP provider is designed around a single configuration source (typical usage is host-level configuration + a feature flag to enable/disable LDAP login).
  • However, implementing per-tenant LDAP is fully achievable by leveraging ABP’s multi-tenancy + Setting Management + service replacement/extension patterns.

  • Recommended approach for per-tenant LDAP/AD
  1. Store LDAP settings per tenant

    • Define your own setting definitions (server, domain/base DN, bind DN, bind password, SSL, port, etc.).
    • Persist them per-tenant using Setting Management (ISettingManager / ISettingProvider), which already supports tenant-scoped values.
  2. Resolve LDAP configuration using ICurrentTenant at runtime

    • In your LDAP auth implementation, always read LDAP settings via ISettingProvider (or ISettingManager) so the current tenant context automatically selects the correct values.
  3. Replace/extend the LDAP authentication implementation

    • ABP’s common pattern for tenant-specific behavior is to replace the related helper/service (using [Dependency(ReplaceServices = true)]) and implement tenant-aware resolution logic.
    • Concretely, you implement a custom LDAP authentication service that:
      • reads tenant-specific LDAP settings,
      • tries LDAP bind/validate for the provided username/password,
      • then maps/creates the corresponding ABP user (Identity module) and proceeds with the normal sign-in flow.

  • Integration points (Identity + Account login flow + Angular)
    • Keep the standard ABP login flow (Account module) and plug LDAP in as an authentication option.

    • Typical pattern:

      1. User enters username/password on the existing login page (Angular).
      2. Server-side login flow checks whether LDAP login is enabled (feature) and/or tenant has LDAP settings configured.
      3. If enabled/configured: attempt LDAP authentication for the current tenant.
      4. If LDAP success: find/create/link the ABP Identity user, then sign-in using the standard ABP/Identity pipeline.
      5. If LDAP fails or not enabled: fallback to local Identity password sign-in (if you want hybrid behavior).
    • Enable/disable per tenant:

      • You can also use Feature Management to toggle “LDAP login enabled” per tenant (in addition to settings), similar to how ABP’s account LDAP feature is handled in general.

  • Official references you can use (verified)
    • ABP LDAP documentation (includes a sample app link you can use to validate LDAP connectivity/config separately):
      • https://abp.io/docs/latest/modules/identity/idap
      • https://github.com/abpframework/abp-samples/tree/master/AbpLdapSample
    • Example of tenant-specific provider selection via replacing a helper (demonstrates the exact ABP technique you’d use for “dynamic providers per tenant”):
      • https://abp.io/support/questions/6637
    • ABP support thread showing LDAP login is controlled via a feature + settings (useful background):
      • https://abp.io/support/questions/2270
    • Multi-tenancy basics (for tenant resolution concepts like ICurrentTenant):
      • https://abp.io/docs/latest/framework/architecture/multi-tenancy

  • What to implement (practical blueprint)
// 1) Define tenant-scoped settings (server, baseDn, bindDn, bindPassword, etc.)
public static class TenantLdapSettings
{
    private const string Prefix = "TenantLdap.";
    public const string Server = Prefix + "Server";
    public const string Port = Prefix + "Port";
    public const string BaseDn = Prefix + "BaseDn";
    public const string BindDn = Prefix + "BindDn";
    public const string BindPassword = Prefix + "BindPassword";
    public const string UseSsl = Prefix + "UseSsl";
}

public class TenantLdapSettingDefinitionProvider : SettingDefinitionProvider
{
    public override void Define(ISettingDefinitionContext context)
    {
        context.Add(
            new SettingDefinition(TenantLdapSettings.Server),
            new SettingDefinition(TenantLdapSettings.Port, "389"),
            new SettingDefinition(TenantLdapSettings.BaseDn),
            new SettingDefinition(TenantLdapSettings.BindDn),
            new SettingDefinition(TenantLdapSettings.BindPassword, isEncrypted: true),
            new SettingDefinition(TenantLdapSettings.UseSsl, "false")
        );
    }
}
// 2) Implement a tenant-aware LDAP authentication service (pseudo-outline)
// Replace the service that the login flow uses to validate credentials.
[Dependency(ReplaceServices = true)]
public class TenantAwareLdapAuthenticator /* : SomeAbpLdapService */
{
    private readonly ISettingProvider _settingProvider;
    private readonly ICurrentTenant _currentTenant;

    public TenantAwareLdapAuthenticator(ISettingProvider settingProvider, ICurrentTenant currentTenant)
    {
        _settingProvider = settingProvider;
        _currentTenant = currentTenant;
    }

    public async Task<bool> ValidateAsync(string userNameOrEmail, string password)
    {
        // Read settings for CURRENT tenant (automatic due to ICurrentTenant)
        var server = await _settingProvider.GetOrNullAsync(TenantLdapSettings.Server);
        if (server.IsNullOrWhiteSpace())
        {
            return false; // tenant not configured => treat as disabled/fallback
        }

        // read other settings...
        // connect/bind to LDAP and validate credentials...
        return true;
    }
}

This is the ABP-supported pattern: tenant-scoped settings + service replacement. The only part you must align in your solution is which exact service/class to replace in the ABP LDAP login integration you’re using (that depends on whether you use the built-in LDAP external provider as-is or a custom login path). The “dynamic provider per tenant” support answer shows the same technique in a verified way.


  • Official “best practice/example” status
    • There is no single official ABP example that demonstrates “full per-tenant LDAP server configuration + dynamic bind per tenant” end-to-end.
    • The verified best-practice building blocks are:
      • tenant-specific configuration via Setting Management,
      • dynamic behavior via service replacement,
      • external provider selection customization pattern (see the verified support answer above).

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 behavior (content visible only after login) is almost always caused by production-only authentication/authorization requirements being applied to the Public Website, not by CMS Kit Pro itself. CMS Kit menus/pages are designed to be publicly renderable; if they disappear for anonymous users, something in the pipeline is treating anonymous requests as unauthorized (and the UI ends up showing nothing / redirects).

  • Apply the following production checks/fixes (these are safe and common causes in multi-tenant + public website deployments):

  1. Ensure your Public Website endpoints allow anonymous
  • Verify you did not add a global authorization requirement in production (common in ConfigureServices / OnApplicationInitialization) such as:
    • options.FallbackPolicy = options.DefaultPolicy;
    • RequireAuthenticatedUser() applied globally
    • A reverse proxy rule that forces auth for all paths
  • If you did, you must explicitly allow anonymous for the CMS/public routes (home page, dynamic pages, menu endpoints, etc.) or remove the fallback/global requirement for the Public Website app.
  1. Verify tenant resolution works for anonymous users in production
  • In multi-tenancy, the public site must resolve the current tenant for anonymous requests (typically via domain/subdomain).
  • In production, if the tenant cannot be resolved for anonymous users, the app may fall back to host context (or hit an authorization/caching branch), causing “missing home page / missing menu”.
  • Make sure the production domain/subdomain mapping is correct and consistent with what you use locally.
  1. Clear/distribute caches in production (especially if you use Redis / distributed cache)
  • If production uses a distributed cache and local does not, cached “not found / unauthorized / empty menu” results can persist across requests and instances.
  • Clear the distributed cache after setting the home page / changing menus, and ensure all instances share the same cache configuration.
  1. Verify CMS Kit features are enabled in the production build
  • Ensure CMS Kit and CMS Kit Pro global features are enabled in GlobalFeatureConfigurator (and the same code is deployed to production). Otherwise some UI pieces can disappear depending on feature flags.
  1. Verify the Public Website is using the correct environment settings for AuthServer / OpenIddict
  • A misconfigured AuthServer in production can result in the app thinking it must challenge even for anonymous pages, which then makes public content appear “restricted”.
  • Double-check production appsettings.Production.json values for auth-related endpoints and the public web’s self URL.

Links (verified)

  • https://abp.io/docs/latest/modules/cms-kit/menus
  • https://docs.abp.io/en/abp/latest/Modules/Cms-Kit/Index
  • https://docs.abp.io/en/commercial/latest/modules/cms-kit/index

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.

  • The log you shared shows ABP Studio backend throwing a NullReferenceException inside the Studio connectivity heartbeat pipeline (IStudioHub/HeartbeatAsync → Volo.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.json → appsettings.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.

Showing 381 to 390 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.