首页 > 解决方案 > 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));

非常感谢先进!

标签: c#asp.netasp.net-core.net-core

解决方案


推荐阅读