首页 > 解决方案 > 如果我使用 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* 

我不明白我错在哪里!

标签: asp.net-web-apimicroservicesasp.net-core-3.1api-gatewayocelot

解决方案


从版本 16.0.0 开始,您需要在 configuration.json 文件中使用“Routes”而不是“ReRoutes”。


推荐阅读