如何在中间件中将响应序列化为JSON的最佳方法?

3

在ASP.NET中,是否有一种规范的方法来利用已配置的JsonOutputFormatter中间件?或者更普遍地说,是否有比在我的中间件中显式调用JsonConvert.SerializeObject更好的将响应序列化为JSON的方法?

目前,我有以下代码:

public static void HandleHealthRequests(this IApplicationBuilder app)
{
    app.Map(new PathString("/health"), builder =>
    {
        builder.Run(async context =>
        {
            string response = JsonConvert.SerializeObject(new { DateTime.UtcNow, Version = _version });
            context.Response.StatusCode = StatusCodes.Status200OK;
            context.Response.ContentType = "application/json";
            context.Response.ContentLength = response.Length;
            await context.Response.WriteAsync(response);
        });
    });
}

这个方法可以工作得很好,但是直接调用 JsonConvert.SerializeObject 并直接操作 Response 感觉不太对。我试图解决 JsonOutputFormatter,以便直接利用它,但它需要一个 OutputFormatterContext,看起来设置起来太复杂了。此外,我还尝试着利用 JsonOutputFormatter.SerializerSettings,但在应用程序启动时发现它为 null,因此我的代码在进程启动时会抛出异常。

请注意,这与地图无关。 - Tratcher
1
这对于一个简单组件看起来很好。JsonOutputFormatter适用于像MVC这样更复杂的环境。 - Tratcher
是的,我上了 Jabbr,@davidfowl 基本上也这么说。谢谢。 - David Peden
@DavidPeden 你找到更优雅的解决方案了吗? - henningst
不需要。这很简单并且有效。如果你想要整理或在其他地方重复使用它,显然你可以将这些调用捆绑成一个方法或其他形式。 - David Peden
1个回答

2

我有一个类似的问题,我想要使用相同的配置来处理所有的JSON响应,无论它们是在中间件、过滤器还是控制器中... 在新版本的.NET Core(至少在Microsoft.AspNetCore.Mvc.Formatters.Json 1.1.2中),我在格式化程序中使用了WriteObject(TextWriter writer, object value)方法,我通过依赖注入解析JsonOutputFormatter并使用该WriteObject方法进行序列化。

var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
jsonOutputFormatter.WriteObject(stringWriter, value);
var responseBody = stringWriter.ToString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接