web-dev-qa-db-ja.com

Asp.Net CoreミドルウェアからのJsonResultを介して応答する方法は?

Asp.Net Coreミドルウェアの一部からJsonResultを介して応答したいのですが、それを行う方法は明らかではありません。私はたくさんググったが、ほとんど成功しなかった。 ActionExecutedContext.ResultJsonResultに設定することで、グローバルIActionFilterからJsonResultを介して応答できます。しかし、この場合、ミドルウェアからJsonResultを効果的に返したいと思います。どうすればそれを達成できますか?

私はJsonResultIActionResultに関して質問を組み立てましたが、理想的には、ソリューションはミドルウェアからの応答を書き込むためにIActionResultを使用するために機能します。

15
Ron C

ミドルウェアは、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);
}
11
Henk Mollema

ミドルウェアから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の出力を返す必要が十分にありました。

6
Ron C