- ABP Framework version: v7.1.0
- UI type: Angular
- DB provider: EF Core
-
- Tiered (MVC) or Identity Server Separated (Angular): yes
I use a microservice solution and it work fine but still have issue related to API Gateway published on IIS.
app.UseAbpSwaggerUI(options =>
{
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
var routes = configuration.GetSection("Routes").Get<List<OcelotConfiguration>>();
var routedServices = routes
.GroupBy(t => t.ServiceKey)
.Select(r => r.First())
.Distinct();
foreach (var config in routedServices.OrderBy(q => q.ServiceKey))
{
var url = $"{config.DownstreamScheme}://{config.DownstreamHostAndPorts.FirstOrDefault()?.Host}:{config.DownstreamHostAndPorts.FirstOrDefault()?.Port}";
// if (!env.IsDevelopment())
// {
// url = $"https://{config.DownstreamHostAndPorts.FirstOrDefault()?.Host}";
// }
options.SwaggerEndpoint($"{url}/swagger/v1/swagger.json", $"{config.ServiceKey} API");
options.OAuthClientId(configuration["AuthServer:SwaggerClientId"]);
}
});
I need to change the not development because my IIS has non different name for single service... or all my service need to be available one by one? (ES. auth.mydomain.com, saas.api.mydomain.com,identity.api.mydomain.com, product.api.mydomain.com, ect)?
My api gateway is publish to FQDN to port 443 but all other service is in "localhost" or "machinename" in other port, so when I open the API gateway swagger the Account service works fine
If I use any other service
10 Answer(s)
-
0
Can you share the error logs?
-
0
Hi
I don't have an error on log side but in cosole
If I try to call via postman the API it works fine
Can you confirm that the microservice not to be exposed on web but only api gateway?
So if you look below the name you see the URL and it is the internal URL (es. localhost:45566 or MY-MACHINE-NAME:45566) and of course it doesn't work
-
0
I think this issue is related to the SWAGGER json.
If I'm inside the network my swagger definition works fine but if I'm outside it doesn't work but API routing works fine inside and outside the network.
Ocelot not support Swagger documentation
-
0
Can you confirm that the microservice not to be exposed on web but only api gateway?
If you run your microservices locally, they won't be exposed to the network.
If I'm inside the network my swagger definition works fine but if I'm outside it doesn't work but API routing works fine inside and outside the network.
Yes, the swagger will send a request to the backend when you switch the API definition, but the client(browser) doesn't know
localhost
, so it can't work with your case. -
0
Ok
so you confirm that swagger in microservice solution doesn't work if u don't expose the single microservice. I think this is a bis issue...
-
0
Hi,
I don't think it's an issue, If you don't publish to the Internet, how can other clients access its resources?
And we don't recommend you expose swagger to the internet, other people can easily see all your API definitions.
-
0
Hi,
I'm not sure that can I understand your reply. I use the eShopLandscape All microservice work on localhost from port 123->128 and API GW replay to api.mydomain.com. Any microservice are directly expose to internet only the GW, but in this case when you try to get the swagger json definition the call we made to localhost and is not possible to complete if you are in the same machine...
-
0
Hi,
As I said, the swagger will send a request(AJAX) to the backend from the client(chrome) when you switch the API definition, but the client(browser) doesn't know localhost, so it can't work with your case.
Maybe I misunderstood your structure.
At your first screenshot, it looks like a CORS problem.
You can update the
appsettings.json
of the service, for example: -
0
Yes it's exactly our issue.
So in microservice we can't expose microservices Swagger. I look to a library to do that https://blog.burgyn.online/2020/04/17/swagger-for-ocelot-api-gateway-en.
I try to invastigate if it's possibile to integrate in ABP.IO
-
0
ok