.net core StreamReader上的EnableRewind和leaveOpen未停止处理请求

.net core StreamReader上的EnableRewind和leaveOpen未停止处理请求,.net-core,.net Core,我正在使用ApplicationInsights,我想将请求和响应添加到日志属性中 为了实现这一点,我正在实现自己的ITelemetryInitializer。看起来就像这样 公共类MyInitializer:ITelemetryInitializer { 专用只读IHttpContextAccessor\u httpContextAccessor; 公共MyInitializer(IHttpContextAccessor httpContextAccessor) { _httpContextA

我正在使用ApplicationInsights,我想将请求和响应添加到日志属性中

为了实现这一点,我正在实现自己的
ITelemetryInitializer
。看起来就像这样

公共类MyInitializer:ITelemetryInitializer
{
专用只读IHttpContextAccessor\u httpContextAccessor;
公共MyInitializer(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
}
公共无效初始化(ITelemetry遥测)
{
var requestTelemetry=作为requestTelemetry的遥测;
如果(requestTelemetry==null | | | httpContextAccessor?.HttpContext?.Request==null
||requestTelemetry.Properties.ContainsKey(“RequestBody”))
{
返回;
}
var request=\u httpContextAccessor?.HttpContext?.request;
请求?.EnableRewind();
if(request.Method.Equals(HttpMethod.Post.ToString(),StringComparison.InvariantCultureIgnoreCase)
||request.Method.Equals(HttpMethod.Put.ToString(),StringComparison.InvariantCultureIgnoreCase))
{
使用(var reader=newstreamreader(request.Body,Encoding.UTF8,true,1024,true))
{
var requestBody=reader.ReadToEnd();
requestTelemetry.Properties.Add(“RequestBody”,RequestBody);
}
}
}
}
在startup中,我添加了这个

services.AddHttpContextAccessor();
services.AddSingleton();
services.AddApplicationInsightsTelemetry();
我得到的错误是:

ObjectDisposedException: Cannot access a disposed object.
Object name: FileBufferingReadStream.
Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.ThrowIfDisposed()

我使用了
.enableRevind
以及指示
StreamReader
使文件保持打开状态。尽管如此,当我的请求实际命中我的控制器时,或者当它再次命中我的初始值设定项进行第二次传递(设置响应信息)时,它仍然是空的

欢迎提出任何建议


此外,我还尝试添加一个中间件,以确保
.EnableRewind
在所有情况下都处于启用状态,但这没有起到任何作用。我不希望添加任何额外的中间件,因为我希望没有其他依赖项

app.Use(异步(上下文,下一步)=>
{
context.Request.EnableRewind();
等待下一个();
});

谢谢。

解决方案总是以一行代码结束。我要感谢Gunnar Peipman先生的博客文章

该行:
request.Body.Seek(0,SeekOrigin.Begin)

代码

公共类MyInitializer:ITelemetryInitializer
{
专用只读IHttpContextAccessor\u httpContextAccessor;
公共MyInitializer(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor=httpContextAccessor;
}
公共无效初始化(ITelemetry遥测)
{
var requestTelemetry=作为requestTelemetry的遥测;
如果(requestTelemetry==null | | | httpContextAccessor?.HttpContext?.Request==null
||requestTelemetry.Properties.ContainsKey(“RequestBody”))
{
返回;
}
var request=\u httpContextAccessor?.HttpContext?.request;
请求?.EnableRewind();
if(request.Method.Equals(HttpMethod.Post.ToString(),StringComparison.InvariantCultureIgnoreCase)
||request.Method.Equals(HttpMethod.Put.ToString(),StringComparison.InvariantCultureIgnoreCase))
{
使用(var reader=newstreamreader(request.Body,Encoding.UTF8,true,1024,true))
{
var requestBody=reader.ReadToEnd();
request.Body.Seek(0,SeekOrigin.Begin);
requestTelemetry.Properties.Add(“RequestBody”,RequestBody);
}
}
}
}