c# - System.InvalidOperationException:读取已经由 api-gateway 之类的应用程序抛出
问题描述
这就是我的 C# 应用程序的工作方式。我收到一个请求,我想将它传递给下游服务,所以是的,我正在充当 api 网关。问题是我看到了System.InvalidOperationException: Reading is already in progress
异常。
代码如下:
// map request
HttpRequest request = GetOriginalRequest();
var requestMessage = new HttpRequestMessage
{
Content = MapContent(request),
Method = MapMethod(request),
RequestUri = MapUri(request)
};
...
// send request
var response = await httpClient.SendAsync(requestMessage); // throws here!!!
MapContent 方法如下所示:
...
request.EnableBuffering(); // it throws if I don't do this
request.Body.Seek(0, SeekOrigin.Begin);
content.Headers.ContentLength = request.ContentLength;
return new StreamContent(request.Body);
这是异常数据:
System.InvalidOperationException: Reading is already in progress.
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1ContentLengthMessageBody.VerifyIsNotReading()
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1ContentLengthMessageBody.TryReadInternal(ReadResult& readResult)
at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1MessageBody.OnConsumeAsync()
我显然省略了许多细节和代码,但这就是本质。
知道如何重用流以将其传递给另一个服务吗?内容不能被复制,因为这会大大降低性能,所以这是不可接受的var content = new ByteArrayContent(await ToByteArray(request.Body));
非常感谢先进!
解决方案
推荐阅读
- javascript - 如何显示音频持续时间并每秒减去一秒?
- python - 使用 Python 箭头设置时间
- django - 使用 Django 制作一个相互依赖的步骤表单
- python-3.x - 如何通过在 Pandas 中使用多个列来提取时间序列中的模式?
- image - 包含 BorderSize 参数时的 Blockproc 错误
- django - 使在 URL 中传递的额外参数作为可选参数
- javascript - Firefox 中的 div-background-switcher 偶尔出现错误
- mysql - 可以在 Spark 中写入 MEDIUMTEXT 类型的 MySQL 列吗?
- javascript - 如何更改 vue-cli 的分隔符?
- python - 如何在 docker 中运行现有的 django 项目?