控制器级别的 ASP.NET Core 3.1 中 JsonOutputFormatter 的替代方案

Ono*_*dai 3 c# asp.net-core asp.net-core-3.1

我有一个自定义过滤器属性,改编自当前为 .NET Core 2.2 实现的这个答案,我想适应 3.1。它引用了 Newtonsoft.JSON,出于兼容性原因,我更愿意保持这种方式。

代码如下:

public class AllPropertiesAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext ctx)
    {
        if (!(ctx.Result is ObjectResult objectResult)) return;

        var serializer = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include };
        serializer.Converters.Add(new StringEnumConverter());

        var formatter = new JsonOutputFormatter(serializer, 
                        ctx.HttpContext.RequestServices.GetRequiredService<ArrayPool<char>>());

        objectResult.Formatters.Add(formatter);
    }
}
Run Code Online (Sandbox Code Playgroud)

JsonOutputFormatter根据官方文档,仅支持 .net core 2.2 ;我应该如何继续在 3.1 下保持相同的行为?

Mik*_*ray 11

Microsoft.AspNetCore.Mvc.NewtonsoftJson 包中的 NewtonsoftJsonOutputFormatter 相当于旧的 JsonOutputFormatter。它有一个小的变化,它也将在构造函数中接受一个 MvcOptions:

    public NewtonsoftJsonOutputFormatter(
        JsonSerializerSettings serializerSettings,
        ArrayPool<char> charPool,
        MvcOptions mvcOptions)
Run Code Online (Sandbox Code Playgroud)

这仅通过SuppressOutputFormatterBuffering选项真正影响行为。您也许可以从 RequestServices 解决它,或者您可以即时创建一个新的。