asp.net-web-api - 如果我使用 Ocelot 16.0 通过网关调用微服务,则会出错
问题描述
我正在使用带有 net.core 3.1 的 Visual Studio 2019 的 apigateway 和微服务员工执行一个项目
我的configuration.json是:
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/employees/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "provadb",
"Port": 80
}
],
"UpstreamPathTemplate": "/api/employees/{everything}",
"UpstreamHttpMethod": [ "POST", "PUT", "GET" ]
}
在控制器中:
public class EmployeesController : ControllerBase
{
private readonly ProvaDBContext _context;
public EmployeesController(ProvaDBContext context)
{
_context = context;
}
// GET: api/Employees
[HttpGet]
public async Task<ActionResult<IEnumerable<Employees>>> GetEmployees()
{
return await _context.Employees.ToListAsync();
}
docker-compose.override.yml
version: '3.4'
services:
shapesapigateway:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:80
ports:
- "7000:80"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
provadb:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://+:80
ports:
- "7004:80"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
- ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
networks:
app-net:
driver: bridge
但如果在浏览器中写:
本地主机:7004/api/员工
结果是:
[
{
"id": 1,
"firstName": "Pranaya",
"lastName": "Rout",
"gender": "Male",
"salary": 60000
},
{
"id": 2,
"firstName": "Anurag",
"lastName": "Mohanty",
"gender": "Male",
"salary": 45000
},
{
"id": 3,
"firstName": "Preety",
"lastName": "Tiwari",
"gender": "Female",
"salary": 45000
},
{
"id": 4,
"firstName": "Sambit",
"lastName": "Mohanty",
"gender": "Male",
"salary": 70000
},
{
"id": 5,
"firstName": "Shushanta",
"lastName": "Jena",
"gender": "Male",
"salary": 45000
},
{
"id": 6,
"firstName": "Priyanka",
"lastName": "Dewangan",
"gender": "Female",
"salary": 30000
},
{
"id": 7,
"firstName": "Sandeep",
"lastName": "Kiran",
"gender": "Male",
"salary": 45000
},
{
"id": 8,
"firstName": "Shudhansshu",
"lastName": "Nayak",
"gender": "Male",
"salary": 30000
},
{
"id": 9,
"firstName": "Hina",
"lastName": "Sharma",
"gender": "Female",
"salary": 35000
},
{
"id": 10,
"firstName": "Preetiranjan",
"lastName": "Sahoo",
"gender": "Male",
"salary": 80000
},
{
"id": 12,
"firstName": "PIO",
"lastName": "NONO",
"gender": "M",
"salary": 1234
}
]
但如果我在浏览器中写:
本地主机:7000/api/员工
*'/usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.10/System.Runtime.Intrinsics.dll' è stato caricato. Caricamento dei simboli ignorato. Il modulo è ottimizzato e l'opzione del debugger 'Solo codice utente' è abilitata.
Microsoft.AspNetCore.Hosting.Diagnostics: Information: Request starting HTTP/1.1 GET http://localhost:7000/api/Employees
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/1.1 GET http://localhost:7000/api/Employees
dbug: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: ocelot pipeline started
Ocelot.Errors.Middleware.ExceptionHandlerMiddleware: Debug: requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: ocelot pipeline started
dbug: Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware[0]
requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: Upstream url path is /api/Employees
Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware: Debug: requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: Upstream url path is /api/Employees
warn: Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware[0]
requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: DownstreamRouteFinderMiddleware setting pipeline errors. IDownstreamRouteFinder returned Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /api/Employees, verb: GET.
Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware: Warning: requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: DownstreamRouteFinderMiddleware setting pipeline errors. IDownstreamRouteFinder returned Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /api/Employees, verb: GET.
warn: Ocelot.Responder.Middleware.ResponderMiddleware[0]
Ocelot.Responder.Middleware.ResponderMiddleware: Warning: requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /api/Employees, verb: GET. errors found in ResponderMiddleware. Setting error response for request path:/api/Employees, request method: GET
requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: Error Code: UnableToFindDownstreamRouteError Message: Failed to match Route configuration for upstream path: /api/Employees, verb: GET. errors found in ResponderMiddleware. Setting error response for request path:/api/Employees, request method: GET
dbug: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: ocelot pipeline finished
Ocelot.Errors.Middleware.ExceptionHandlerMiddleware: Debug: requestId: 0HM5DM6ULMR8I:00000002, previousRequestId: no previous request id, message: ocelot pipeline finished
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 23.4902ms 404*
我不明白我错在哪里!
解决方案
从版本 16.0.0 开始,您需要在 configuration.json 文件中使用“Routes”而不是“ReRoutes”。
推荐阅读
- c - 链接静态库时如何禁止GCC删除未使用的函数?
- ruby-on-rails - 将静态网站部署到 heroku 但错误:'找不到那个应用程序?'
- c# - unity,动画重复播放,无需输入
- angular - 角度 6 中延迟加载面临的问题
- r - 如何使用 foreach 函数进行并行编码?
- npm - package.json 依赖项和已发布依赖项之间的区别?
- laravel - 在 laravel 迁移中,它将布尔类型更改为 tinyint(1)
- php - Symfony 4,PROD 模式下的条件路由重定向/覆盖
- javascript - 在 react redux 中处理具有不同参数的多个请求
- c# - 如何在网格 acumatica 上添加自定义操作按钮