web-dev-qa-db-fra.com

Comment répondre via un JsonResult à partir du middleware Asp.Net Core?

Je voudrais répondre via un JsonResult à partir d'un morceau de middleware Asp.Net Core mais il n'est pas évident de savoir comment y parvenir. J'ai googlé beaucoup mais avec peu de succès. Je peux répondre via un JsonResult depuis un global IActionFilter en définissant le ActionExecutedContext.Result au JsonResult et c'est cool. Mais dans ce cas, je veux retourner efficacement un JsonResult de mon middleware. Comment cela peut-il être accompli?

J'ai cadré la question en ce qui concerne le JsonResultIActionResult mais idéalement la solution fonctionnerait pour utiliser n'importe quel IActionResult pour écrire la réponse du middleware.

15
Ron C

Le middleware est un composant de bas niveau d'ASP.NET Core. L'écriture JSON (efficace) est implémentée dans le référentiel MVC. Plus précisément, dans le composant formateurs JSON .

Cela revient essentiellement à écrire du JSON sur le flux de réponse. Dans sa forme la plus simple, il peut être implémenté dans un middleware comme ceci:

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);
}
11
Henk Mollema

Pour d'autres qui pourraient être intéressés par la façon de retourner la sortie d'un JsonResult à partir d'un middleware, voici ce que j'ai trouvé:

  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);
    }

Cette approche permet à un élément de middleware de renvoyer la sortie d'un JsonResult et l'approche est proche de pouvoir permettre au middleware de renvoyer la sortie de n'importe quel IActionResult. Pour gérer ce cas plus générique, le code de création de ActionDescriptor devrait être amélioré. Mais le prendre à ce point était suffisant pour mes besoins de retourner la sortie d'un JsonResult.

6
Ron C