ASP.NET Core 无法访问已释放的对象

问题描述 投票:0回答:1

我创建了一个自定义

IAsyncAuthorizationFilter
属性。

public class CustomeAttribute : Attribute, IAsyncAuthorizationFilter
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
    {
        var dto = new DTO();
        var httpContextAccessor = context.HttpContext.RequestServices.GetRequiredService<IHttpContextAccessor>();
        var requestBody = httpContextAccessor.HttpContext?.Request.Body;
        if (requestBody != null && requestBody.CanSeek)
        {
            requestBody.Position = 0;
            using var reader = new StreamReader(requestBody);
            var requestBodyString = await reader.ReadToEndAsync();
            var options = new JsonSerializerOptions
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
            };
            dto = JsonSerializer.Deserialize<DTO>(requestBodyString, options);
        }
    }
}

在program.cs中,我添加了以下内容

builder.Services.AddScoped<IAsyncAuthorizationFilter, CustomeAttribute>();

app.Use(async (context, next) =>
{
    context.Request.EnableBuffering();
    await next();
});

我在控制器中使用了该属性,如下所示:

[HttpPost]
[CustomeAttribute )]
public async Task<IActionResult> Add([FromBody] DTO dTO)

OnAuthorizationAsync 正确完成,但随后我收到错误:

{“无法访问已处置的对象。 对象名称:'System.String'。"}

为什么?

c# asp.net asp.net-mvc asp.net-core asp.net-web-api
1个回答
0
投票

使用的

StreamReader
构造函数将导致处理传递的流:

当调用

StreamReader
时,
Dispose()
对象会在提供的
Stream
对象上调用
StreamReader.Dispose

尝试使用允许传递

leaveOpen
参数的构造函数:

using var reader = new StreamReader(requestBody, leaveOpen: true);

备注:

  1. 读完后不要忘记倒带
    requestBody.Position = 0;
  2. 错误的异常报告
    String
    作为已处置对象应在下一个 ASP.NET Core 版本中使用 此 PR 进行修复。
© www.soinside.com 2019 - 2024. All rights reserved.