我想通过来自一个Asp.Net Core中间件的JsonResult
回复,但是如何实现这一点并不明显。我用Google搜索了很多但收效甚微。我可以通过将JsonResult
设置为IActionFilter
,通过全球ActionExecutedContext.Result
的{{1}}进行回复,这很酷。但在这种情况下,我想从我的中间件中有效地返回JsonResult
。怎么能实现呢?
我提出了关于JsonResult
JsonResult
的问题,但理想情况下,解决方案可以使用任何IActionResult
来编写来自中间件的响应。
答案 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"
}));
});
}
}