Asp.Net Coreミドルウェアの一部からJsonResult
を介して応答したいのですが、それを行う方法は明らかではありません。私はたくさんググったが、ほとんど成功しなかった。 ActionExecutedContext.Result
をJsonResult
に設定することで、グローバルIActionFilter
からJsonResult
を介して応答できます。しかし、この場合、ミドルウェアからJsonResult
を効果的に返したいと思います。どうすればそれを達成できますか?
私はJsonResult
IActionResult
に関して質問を組み立てましたが、理想的には、ソリューションはミドルウェアからの応答を書き込むためにIActionResult
を使用するために機能します。
ミドルウェアは、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);
}
ミドルウェアから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
の出力を返す必要が十分にありました。