我创建了一个自定义
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'。"}
为什么?
StreamReader
构造函数将导致处理传递的流:
当调用
时,StreamReader
对象会在提供的Dispose()
对象上调用Stream
。StreamReader.Dispose
尝试使用允许传递
leaveOpen
参数的构造函数:
using var reader = new StreamReader(requestBody, leaveOpen: true);
备注:
requestBody.Position = 0;
String
作为已处置对象应在下一个 ASP.NET Core 版本中使用 此 PR 进行修复。