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

Ron*_*n C 14 asp.net-mvc json middleware asp.net-core

我想通过一个JsonResultAsp.Net Core中间件来回应,但是如何实现这一点并不明显.我用Google搜索了很多但收效甚微.我可以通过一个JsonResult全局来回应,通过IActionFilter设置ActionExecutedContext.ResultJsonResult那个很酷.但在这种情况下,我想JsonResult从我的中间件中有效地返回一个.怎么能实现呢?

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

Hen*_*ema 12

中间件是ASP.NET Core的一个非常低级的组件.写出JSON(高效)是在MVC存储库中实现的.具体来说,在JSON格式化程序组件中.

它基本归结为在响应流上编写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);
}
Run Code Online (Sandbox Code Playgroud)

  • @汉克,感谢您的回复。我知道我可以使用Response.WriteAsync发送原始的json,但是这种方法容易忽略诸如忘记将`content-type` repsonse标头设置为“ application / json; charset = utf-8”之类的事情。:-)这就是为什么我特别询问如何通过JsonResult进行响应,而不是简单地如何发送json响应。另外,我对有关“ JsonResult”,“ IActionResult”的问题进行了框架化,但理想情况下,该解决方案适用于使用任何“ IActionResult”编写来自中间件的响应。我将更新问题以表明这一点。 (2认同)

Ron*_*n C 8

对于其他可能对如何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);
    }
Run Code Online (Sandbox Code Playgroud)

这种方法允许一个中间件从a返回输出,JsonResult并且该方法接近于能够使中间件从任何地方返回输出.IActionResult.处理更通用的情况,用于创建的代码ActionDescriptor将需要改进.但是把它带到这一点就足以满足我对返回a的输出的需求JsonResult.

  • 这是一个很好的答案,对我有用。这里的巫术是 ExecuteResultAsync 正在为您写入响应流。 (2认同)

Zak*_*med 8

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

启动.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"
            }));
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

例如

using Microsoft.AspNetCore.Http;

// ..

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