使用 Ocelot 16.0 通过网关调用微服务时出错

问题描述

我正在使用带有 net.core 3.1 的 Visual Studio 2019 和微服务员工执行一个项目

我的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

但如果在浏览器中写入:

localhost:7004/api/Employees

结果是:

[
    {
        "id": 1,"firstName": "Pranaya","lastName": "Rout","gender": "Male","salary": 60000
    },{
        "id": 2,"firstName": "Anurag","lastName": "Mohanty","salary": 45000
    },{
        "id": 3,"firstName": "Preety","lastName": "Tiwari","gender": "Female",{
        "id": 4,"firstName": "Sambit","salary": 70000
    },{
        "id": 5,"firstName": "Shushanta","lastName": "Jena",{
        "id": 6,"firstName": "Priyanka","lastName": "Dewangan","salary": 30000
    },{
        "id": 7,"firstName": "Sandeep","lastName": "Kiran",{
        "id": 8,"firstName": "Shudhansshu","lastName": "Nayak",{
        "id": 9,"firstName": "Hina","lastName": "Sharma","salary": 35000
    },{
        "id": 10,"firstName": "Preetiranjan","lastName": "Sahoo","salary": 80000
    },{
        "id": 12,"firstName": "PIO","lastName": "NONO","gender": "M","salary": 1234
    }
]

但是如果我在浏览器中写:

localhost:7000/api/Employees

 *'/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: @R_23_4045@ion: 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,message: ocelot pipeline started
    dbug: Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware[0]
          requestId: 0HM5DM6ULMR8I:00000002,message: Upstream url path is /api/Employees
    Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware: Debug: requestId: 0HM5DM6ULMR8I:00000002,message: Upstream url path is /api/Employees
    warn: Ocelot.DownstreamRouteFinder.Middleware.DownstreamRouteFinderMiddleware[0]
          requestId: 0HM5DM6ULMR8I:00000002,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,verb: GET.
    warn: Ocelot.Responder.Middleware.ResponderMiddleware[0]
    Ocelot.Responder.Middleware.ResponderMiddleware: Warning: requestId: 0HM5DM6ULMR8I:00000002,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,request method: GET
    dbug: Ocelot.Errors.Middleware.ExceptionHandlerMiddleware[0]
          requestId: 0HM5DM6ULMR8I:00000002,message: ocelot pipeline finished
    Ocelot.Errors.Middleware.ExceptionHandlerMiddleware: Debug: requestId: 0HM5DM6ULMR8I:00000002,message: ocelot pipeline finished
    info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
          Request finished in 23.4902ms 404* 

我不明白我错在哪里!

解决方法

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