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

时间:2017-03-29 22:37:32

标签: json asp.net-mvc asp.net-core middleware

我想通过来自一个Asp.Net Core中间件的JsonResult回复,但是如何实现这一点并不明显。我用Google搜索了很多但收效甚微。我可以通过将JsonResult设置为IActionFilter,通过全球ActionExecutedContext.Result的{​​{1}}进行回复,这很酷。但在这种情况下,我想从我的中间件中有效地返回JsonResult。怎么能实现呢?

我提出了关于JsonResult JsonResult的问题,但理想情况下,解决方案可以使用任何IActionResult来编写来自中间件的响应。

3 个答案:

答案 0 :(得分:11)

中间件是ASP.NET Core的一个非常低级的组件。写出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);
}

答案 1 :(得分:6)

对于其他可能对如何从中间件返回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的输出。

答案 2 :(得分:2)

正如@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"
            }));
        });
    }
}