ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题
Posted
技术标签:
【中文标题】ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题【英文标题】:Ocelot API Gateway Custom Aggregator Issue in ASP.NET Core 3.1 【发布时间】:2021-01-22 01:23:10 【问题描述】:我在 ASP.NET 中使用 Ocelot 实现自定义聚合器,它在 Startup.cs Ocelot 中间件中引发错误。但是,这两个微服务都可以正常工作并独立获取数据。
当我从我的 API 网关调用它们时,它会抛出错误。
Startup.cs
public class Startup
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
services.AddOcelot()
.AddSingletonDefinedAggregator<MyAggregator>();
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public async void Configure(IApplicationBuilder app, IWebHostEnvironment env)
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
app.UseRouting();
app.UseEndpoints(endpoints =>
endpoints.MapControllers();
);
await app.UseOcelot();
这是我的 ocelot.json 文件,用于不同微服务的路由。
ocelot.json
"ReRoutes": [
"DownstreamPathTemplate": "/user/getUser",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": "44378"
],
"UpstreamPathTemplate": "/getUser",
"Key": "User"
,
"DownstreamPathTemplate": "/product/getProduct",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": "44357"
],
"UpstreamPathTemplate": "/getProduct",
"Key": "Product"
],
"Aggregates": [
"ReRouteKeys": [
"User",
"Product"
],
"UpstreamPathTemplate": "/UserAndProduct"
],
"GlobalConfiguration":
"BaseUrl": "http://localhost:5000/"
我的自定义聚合器类
MyAggregator.cs
public class MyAggregator : IDefinedAggregator
public async Task<DownstreamResponse> Aggregate(List<HttpContext> responses)
var one = await responses[0].Items.DownstreamResponse().Content.ReadAsStringAsync();
var two = await responses[1].Items.DownstreamResponse().Content.ReadAsStringAsync();
var contentBuilder = new StringBuilder();
contentBuilder.Append(one);
contentBuilder.Append(two);
var stringContent = new StringContent(contentBuilder.ToString())
Headers = ContentType = new MediaTypeHeaderValue("application/json")
;
return new DownstreamResponse(stringContent, HttpStatusCode.OK, new List<KeyValuePair<string, IEnumerable<string>>>(), "OK");
【问题讨论】:
【参考方案1】:您忘记在 ocelot.json
文件中提及您的自定义聚合器。每当您点击 /UserAndProduct
时,Ocelot 都需要知道您的自定义聚合器。
“聚合”:[ “重新路由键”:[ “用户”, “产品” ], "UpstreamPathTemplate": "/UserAndProduct" ]
ocelot 的最新版本发生了重大变化。使用密钥
Routes
而不是 ReRoutes
。您可以使用以下 json 文件。
"Routes": [
"DownstreamPathTemplate": "/user/getUser",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": "44378"
],
"UpstreamPathTemplate": "/getUser",
"Key": "User"
,
"DownstreamPathTemplate": "/product/getProduct",
"DownstreamScheme": "https",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": "44357"
],
"UpstreamPathTemplate": "/getProduct",
"Key": "Product"
],
"Aggregates": [
"RouteKeys": [
"User",
"Product"
],
"UpstreamPathTemplate": "/UserAndProduct",
"Aggregator": "MyAggregator"
],
"GlobalConfiguration":
"BaseUrl": "http://localhost:5000/"
【讨论】:
我也试过这个,但仍然是同样的错误。 使用“Routes”而不是“ReRoutes”和“RouteKeys”而不是“ReRouteKeys”。我已经更新了我的答案。您可以使用给定的 ocelot.json 文件。它现在应该可以工作了。以上是关于ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题的主要内容,如果未能解决你的问题,请参考以下文章
ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL
ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题
如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的 `applicationUrl` 属性?