如何通过Asp.NetCore中间件的JsonResult进行响应?

njthzxwz  于 2023-01-06  发布在  .NET
关注(0)|答案(4)|浏览(433)

我想通过一个来自ASP.NET Core中间件的JsonResult进行响应,但如何实现并不明显。我在Google上搜索了很多,但几乎没有成功。我可以通过将ActionExecutedContext.Result设置为JsonResult来从全局IActionFilter通过JsonResult进行响应,这很酷。但是在本例中,我希望从中间件有效地返回一个JsonResult,这如何实现呢?
我提出了关于JsonResultIActionResult的问题,但理想情况下,该解决方案将适用于使用任何IActionResult来编写来自中间件的响应。

x7yiwoj4

x7yiwoj41#

中间件是ASP.NET核心的一个非常底层的组件。(高效地)写出JSON是在MVC存储库中实现的。具体来说,是在JSON formatters组件中。
它基本上可以归结为在响应流上编写JSON,其最简单的形式可以在中间件中实现,如下所示:

using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;

// ...

public async Task Invoke(HttpContext context)
{
    var result = new SomeResultObject();
    var json = JsonConvert.SerializeObject(result);
    await context.Response.WriteAsync(json);
}
ej83mcc0

ej83mcc02#

对于其他可能对如何从中间件返回JsonResult的输出感兴趣的人,下面是我想到的方法:

public async Task Invoke(HttpContext context, IHostingEnvironment env) {
        JsonResult result = new JsonResult(new { msg = "Some example message." });
        RouteData routeData = context.GetRouteData();
        ActionDescriptor actionDescriptor = new ActionDescriptor();
        ActionContext actionContext = new ActionContext(context, routeData, actionDescriptor);
        await result.ExecuteResultAsync(actionContext);
    }

这种方法允许一个中间件返回JsonResult的输出,并且这种方法几乎能够使中间件返回任何IActionResult.的输出。为了处理更一般的情况,创建ActionDescriptor的代码需要改进。但是,到此为止,我已经足够满足返回JsonResult的输出的需要了。

kpbwa7wx

kpbwa7wx3#

正如@Henk Mollema所解释的,我还使用了Newtonsoft.Json JsonConvert类,通过SerializeObject方法将对象序列化为JSON。对于ASP.NET Core 3.1,我在Run方法中使用了JsonConvert。以下解决方案对我很有效:
Startup.cs

using Newtonsoft.Json;

// ...

public class Startup
{
    public void Configure(IApplicationBuilder app) 
    {
        app.Run(async context =>
        {
            context.Response.StatusCode = 200;
            context.Response.ContentType = "application/json";
            await context.Response.WriteAsync(JsonConvert.SerializeObject(new
            {
                message = "Yay! I am a middleware"
            }));
        });
    }
}
bvhaajcl

bvhaajcl4#

从ASP.NETCore5.0开始,您可以使用WriteAsJsonAsync将JSON写入响应流。此方法处理序列化并适当地设置内容类型标头。
例如

using Microsoft.AspNetCore.Http;

// ..

public async Task InvokeAsync(HttpContext context)
{
    var result = new SomeResultObject();
    await context.Response.WriteAsJsonAsync(result);
}

相关问题