Is it possible because of ConcurrencyStamp? For above simple statement, it should not take more than 30 seconds;
Figured out the reason, We have same micro service, controllers end with "-public", we want to available to public gateway. Here is AI's answer:
Ocelot uses MMLib.SwaggerForOcelot which downloads all downstream swagger.json files and merges them into the gateway's own swagger.json. So when Swagger UI requests /swagger/v1/swagger.json, it gets a locally generated document that goes through the full SwaggerGen pipeline — including DocInclusionPredicate and DocumentFilter. Swagger UI → /swagger/v1/swagger.json (gateway's OWN doc) ↓ SwaggerGen pipeline runs ↓ DocInclusionPredicate ✅ fires DocumentFilter ✅ fires ↓ Merged & filtered result
YARP simply forwards the request to the downstream service and returns the raw response. The gateway's SwaggerGen pipeline is never involved. Swagger UI → /swagger-json/ClientService/swagger/v1/swagger.json ↓ YARP proxies request to https://localhost:44368/swagger/v1/swagger.json ↓ Raw downstream swagger.json returned directly ↓ DocInclusionPredicate ❌ never fires DocumentFilter ❌ never fires
The solution is add a SwaggerDoc to this MicroSerivce with name "public" and at public gateway yarp setting using: "Transforms": [ { "PathSet": "/swagger/public/swagger.json" } ]
Here is our settings:
"ReverseProxy": {
"Routes": {
"ClientServicePublic": {
"ClusterId": "ClientService",
"Match": {
"Path": "/api/client-service-public/{**catch-all}"
}
},
"ClientServiceSwagger": {
"ClusterId": "ClientService",
"Match": {
"Path": "/swagger-json/ClientService/swagger/v1/swagger.json"
},
"Transforms": [
{ "PathRemovePrefix": "/swagger-json/ClientService" }
]
},
"IdentityPublic": {
"ClusterId": "Identity",
"Match": {
"Path": "/api/identity-public/{**catch-all}"
}
},
"IdentitySwagger": {
"ClusterId": "Identity",
"Match": {
"Path": "/swagger-json/Identity/swagger/v1/swagger.json"
},
"Transforms": [
{ "PathRemovePrefix": "/swagger-json/Identity" }
]
},
"SignalRNegotiate": {
"ClusterId": "ClientServiceSignalR",
"Match": {
"Path": "/signalr/negotiate",
"Methods": [ "POST", "OPTIONS" ]
}
},
"SignalRHub": {
"ClusterId": "ClientServiceSignalR",
"Match": {
"Path": "/signalr/{**catch-all}",
"Methods": [ "GET", "POST", "PUT", "DELETE", "OPTIONS" ]
}
}
},
"Clusters": {
"ClientService": {
"Destinations": {
"ClientService": {
"Address": "https://localhost:44368/"
}
}
},
"ClientServiceSignalR": {
"Destinations": {
"ClientService": { "Address": "https://localhost:44368/" }
},
"SessionAffinity": {
"Enabled": true,
"Policy": "Cookie",
"AffinityKeyName": "ASP.NET_SessionId",
"Cookie": {
"Expiration": "00:30:00"
}
}
},
"Identity": {
"Destinations": {
"Identity": {
"Address": "https://localhost:44388/"
}
}
}
}
}
Before upgrade, our public gateway only expose controller end with '-public', during upgrade process, I see it keep the same. But I not sure, when it shows all APIs, it might because I 1) replace Ocelot with yarp 2) move yarp.json to appsettings.json 3) replace AddAbpSwaggerGenWithOAuth with AddAbpSwaggerGenWithOidc
Do I still need to AddYarp() call after I move yarp.json content to appsettings? I deleted the yarp file after content merge.
My bad, it is introduce by Microsoft.Graph 4.54.0 that the application use. There is another vulnerable package Volo.Abp.TextTemplating.Scriban 10.1.1 it depends on Scriban 6.3.0 which has high-severity vulnerabilities.
If I set app or tenant level to EST, and get datetime value from database, which method I should call to Convert Utc to EST time?
Finally figure out the solution, I am using VS 2026 or command line to build, still got same build error. First make sure the two partial override has no any implementation, public override partial IdentityUserEto Map(IdentityUser source); public override partial void Map(IdentityUser source, IdentityUserEto destination);
And add these lines to project file: <PropertyGroup> <EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles> <CompilerGeneratedFilesOutputPath>Generated</CompilerGeneratedFilesOutputPath> </PropertyGroup> <ItemGroup> <Compile Remove="$(CompilerGeneratedFilesOutputPath)/**/*.cs" /> </ItemGroup>