- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我设计的微服务架构如下:
网关使用 Ocelot 转发请求。我想更改从网关端的移动设备收到的请求中的正文,并在正文中添加新的 GUID。微服务使用 CQRS 模式,因此命令不应返回任何内容。我实现了自定义中间件来更改 DownstreamContext:
public override async Task Execute(DownstreamContext context)
{
var secondRequest = JObject.Parse(await context.DownstreamRequest.Content.ReadAsStringAsync());
secondRequest["token"] = "test";
secondRequest["newId"] = Guid.NewGuid();
context.DownstreamRequest.Content = new StringContent(secondRequest.ToString(), Encoding.UTF8);
await this.Next(context);
}
我在调用 await this.Next(context) 之前调试了这个和 DownstreamRequest 的内容;改变了,但是传入微服务的请求没有改变。有什么方法可以更改网关中的请求并将此请求以更改后的形式转发给微服务吗?
最佳答案
您可以为其使用自定义中间件
public class SetGuidMiddleware
{
private readonly RequestDelegate _next
public SetGuidMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (!HttpMethods.IsGet(context.Request.Method)
&& !HttpMethods.IsHead(context.Request.Method)
&& !HttpMethods.IsDelete(context.Request.Method)
&& !HttpMethods.IsTrace(context.Request.Method)
&& context.Request.ContentLength > 0)
{
//This line allows us to set the reader for the request back at the beginning of its stream.
context.Request.EnableRewind();
var buffer = new byte[Convert.ToInt32(context.Request.ContentLength)];
await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
var bodyAsText = Encoding.UTF8.GetString(buffer);
var secondRequest = JObject.Parse(bodyAsText);
secondRequest["token"] = "test";
secondRequest["newId"] = Guid.NewGuid();
var requestContent = new StringContent(secondRequest.ToString(), Encoding.UTF8, "application/json");
context.Request.Body = await requestContent.ReadAsStreamAsync();
}
await _next(context);
}
}
并在Ocelot之前使用它
app.UseMiddleware<SetGuidMiddleware>();
app.UseOcelot().Wait();
关于c# - Ocelot - 更改网关中的上游请求主体不会导致下游请求发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59947098/
我正在使用 Jenkins 进行持续集成。我创建了单独的 View ,例如服务器 A 的 View A 、服务器 B 的 View B 等。 每个 View 都会根据服务器的环境属性构建我的项目。 但
我有以下伪代码: var queue = new BufferBlock(new DataflowBlockOptions { BoundedCapacity = 5 }); var a = new
我想这样做,但是在 Jenkins DSL 中: 如果在某个地方找到了这个,但它不工作: job('ps-first') { steps { shell('echo "landing"') }
我们的 API 中有一个路由(在调用时)会访问另一个第 3 方 API。 例如 HTTP-GET/account/1 这会从我们的数据库返回一些数据,并从.. 说 .. 像 Auth0/Okta/Sa
我是一名优秀的程序员,十分优秀!