如何配置 ocelot api-gateway net 6.0,以便将请求重定向到同一 Web 应用程序(相同主机和端口)中的控制器?

2024-01-08

目标框架 net 6.0 ocelot 18.0.0

程序.cs:

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

var ocelotConfig = builder.Configuration.AddJsonFile(Path.Combine(builder.Environment.ContentRootPath, "ocelot.json"), optional: false, reloadOnChange: true);
builder.Services.AddOcelot(builder.Configuration);
builder.Services.AddControllers();

var app = builder.Build();

app.UseOcelot();
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();

app.Run();

ocelot.json:

{
  "GlobalConfiguration": {
    "BaseAddress": "https://localhost:7249"
  },
  "Routes": [
    {
      "DownstreamPathTemplate": "/api/WeatherForecast",
      "DownstreamScheme": "https",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 7249
        }
      ],
      "UpstreamPathTemplate": "/gtw/WeatherForecast",
      "UpstreamHttpMethod": [ "Get" ]
    }
  ]
}

WeatherForcastController.cs:

using Microsoft.AspNetCore.Mvc;

namespace DemoApiGateway.Controllers;

[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

当我尝试调用 https://localhost:7249/gtw/WeatherForecast 或直接调用 https://localhost:7249/api/WeatherForecast 时,我得到响应 Http 404。

附: 在早期版本的 .net core (2.2) 中它可以工作。但它已被弃用,我想重建为 .net 的 LTS 版本。


它不起作用,因为 Ocelot 处理上游调用/api/WeatherForecast,开始下游调用/gtw/WeatherForecast,再次由 Ocelot 处理,并且永远不会到达控制器。
最小 API 做了一些事情。实际上,您的中间件管道如下所示:

app.UseRouting();       // added implicitly
app.UseOcelot();
app.UseHttpsRedirection();
app.UseAuthorization();
app.UseEndpoints(e =>   // added implicitly
{
    e.MapControllers();
});

中间件顺序注册至关重要:每个中间件都会按照注册的顺序处理传入的请求。您的代码中存在多个问题:

  • The UseHttpsRedirection应该在之前调用UseRouting(这是隐式添加的)。禁用隐式添加UseRouting您应该在正确的位置明确调用它。
  • The UseAuthorization应该在之前调用UseOcelot如果您在 Ocelot 配置中使用授权。
  • Ocelot是一个终端中间件,这意味着在Ocelot之后不会执行任何内容UseOcelot。它的意思是Endpoints中间件将没有机会处理请求并将其分派给WeatherForecastController。之后注册 OcelotEndpoints你应该打电话UseEndpoints明确地在正确的位置。

固定代码应该是:

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(e =>
{
    e.MapControllers();
});
app.UseOcelot();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何配置 ocelot api-gateway net 6.0,以便将请求重定向到同一 Web 应用程序(相同主机和端口)中的控制器? 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 但说真的...... ASP.NET WebAPI 实现示例(包括 OAuth)

    我真的对 WCF 示例不感兴趣 我发现的 DotNetOpenAuth 实现也是不完整的 https github com DavidChristiansen DotNetOpenAuth WebAPI 40 or 假设WCF https
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • JSON.Net读取错误

    我正在尝试使用 Json Net 解析一些 JSON 数据 这是我的数据 UIDClan 1 UIDKnjiga 1 Naslov Title1 DatumZaKada 2013 08 09 00 00 00 DatumIstekRez n
  • 在Java中访问其他类文件

    我们刚刚开始为我的学位学习 Java 我得到了一个文件夹 其中包含各种 Java 类 每个类都有自己的 java 文件 文件名与其所在类的名称相同 有一个文件托管一个公共类 其中包含以下内容 public static void main
  • 修改不是先前提交的提交[重复]

    这个问题在这里已经有答案了 我经常会有如下的工作流程 提交对一组文件的更改 将更改提交到不同的文件组 意识到我错过了一些属于第一次提交的更改 Curse 我无法利用git commit amend因为这不是我需要更改的最新提交 将更改添加到
  • 修复了推回内容的元素

    我正在寻找一种在页面顶部有一个固定元素的方法 该元素会根据页面宽度改变高度 并且还会推回下面的内容 到目前为止我已经解决了一些问题 但我希望有一个更干净的解决方案 我所做的是让两个顶部元素具有相同的内容 一个设置为固定位置 另一个设置为相对
  • 在加载时无需事件即可将数据从子级传递到父级,这在 vue 世界中可能吗?

    我觉得如果没有 click 事件或事件或输入字段或某些需要交互的东西 则不可能将数据从子级传递到父级 只需在加载时通 过使用此数据中的变量和控制将数据从子级数据变量传递到另一个数据变量中的父级父变量 只是加载时 可能吗 将 JSON 数据从
  • 表达式树的后缀表示法

    关于如何将表达式树转换为后缀表示法 有足够的资源 而且并不难 但我必须将后缀表达式解析为表达式树 表达式为 A 2 2 A B B 2 A B 我真的不知道如何解释这个表达式 有人知道如何处理这个问题吗 创建一个包含可能是树一部分的节点的堆
  • 拦截windows打开的文件

    我正在尝试制作一个可以拦截文件打开过程的小程序 目的是当用户双击给定文件夹中的文件时 Windows会向软件发出通知 然后软件处理该请求并将文件的数据返回给Windows 也许还有另一种解决方案 例如监视 Open 消息并强制 Window
  • Android Studio -- 无法编辑文件

    我认为这是一个非常愚蠢的问题 而且我找不到任何其他类似的问题 所以我认为它真的很愚蠢 但它仍然让我发疯 我无法弄清楚这一点 因此 每次我在 Android Studio 中打开文件时 它都不会让我编辑它 就像它处于某种只读或选择模式或其他模
  • Python 列表和 foreach 访问(在内置列表中查找/替换)

    我原本以为Python是一种纯粹的引用传递语言 来自 C C 的我忍不住会想到内存管理 而且很难将它从我的脑海中抹去 因此 我尝试从 Java 的角度来考虑它 并将除原语之外的所有内容都视为按引用传递 问题 我有一个列表 其中包含一堆用户定
  • Dictionary.values() 列表与集合中查找的时间复杂度[重复]

    这个问题在这里已经有答案了 在Python中 我们知道在字典中查找键需要O 1 运行时间 但是在dictionary values 中查找的运行时间是多少 dictionary a 66 77 88 b 99 100 key a if ke
  • Three.js DoubleSided 材质不会在平面参数几何体的两侧投射阴影

    看看这个jsfiddle http jsfiddle net blwoodley 5Tr4D 1 http jsfiddle net blwoodley 5Tr4D 1 我有一个蓝色聚光灯 照射在旋转的旋转正方形上 这会给地下地面投射阴影
  • 将身高设置为 100%

    我需要将所有网页 主页除外 的正文位于http www zorglegal nl http www zorglegal nl到相同的高度 100 浏览器高度 因此右侧的棕色条从上到下全屏拉伸 我怎样才能最好地实现这一目标 html heig
  • 在 tkinter 循环中不断访问线程

    我正在尝试制作一个 GUI 来连续绘制从微处理器接收到的信号 我试图仅通过使用类来实现这一点 但失败了 因为只有 GUI 类是 oppend 的 现在我已经实现了线程 或者至少我认为我已经实现了 但每个线程只运行一次 这让我相信我不明白 t
  • 类中具有相同变量名的多重继承

    我无意中遇到了多重继承中使用的类中具有相同名称的成员变量的问题 我的基本想法是成员变量是简单的 合并 即发生多重声明 编译器甚至没有告诉我警告 请参阅下面的 MWE 我知道使用相同名称的变量是一个坏主意 所以我认为以我的方式引用它们至少是不
  • ASP.net MVC 导航栏品牌到标题文本颜色

    令人惊讶的是 要找到这个问题的答案并不容易 我想更改标题中所有操作链接的文本颜色 我试过这段代码 CSS navbar brand color black navbar brand visited color black navbar de
  • 如何在 GAE 之上运行 WebSocket 服务器?

    如何在 Google App Engine 上运行 WebSocket 服务器 是否可以 有可能吗 是否可以 No 您现在不能 因为 GAE 不允许通用入站套接字连接 每个请求也被限制为 30 秒 但这可以通过自动重新连接和会话跟踪轻松解决
  • 我可以用类定义覆盖 #id ul li 行为吗

    我有一个由 id 标识的区域 并且有一个 CSS 如下所示 id ul li margin 0 对于该区域的特定 UL 我可以覆盖边距设置吗 据我所知 id 在评估格式方面具有非常高的优先级 我努力了 myclass ul li margi
  • Rust 向量 (`Vec`) 与数组 (`[T; n]`) 的性能 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 在 Rust 中使用向量与数组相比 性能损失了多少 我所说的性能是指 元素访问的速度或迭代的速度 它们都将数据存储在线性连续数组中
  • 使用 Cython 将 Python 编译为 C

    我正在尝试编译python源代码 foo py 到 C 使用cython http cython org In foo py print Hello World 我正在运行的命令是cython foo py 问题是当使用编译 foo c 时
  • 如何配置 ocelot api-gateway net 6.0,以便将请求重定向到同一 Web 应用程序(相同主机和端口)中的控制器?

    目标框架 net 6 0 ocelot 18 0 0 程序 cs using Ocelot DependencyInjection using Ocelot Middleware var builder WebApplication Cre