ASP.NET Core MVCのIActionFilter.OnActionExecutedメソッドが実行されると、ControllerでActionが返すオブジェクトがHttp Responseに出力されているかどうか...


私たちはASP.NET Core MVCプロジェクトには、以下のHomeControllerがあります.using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionFilter.Controllers { public class HomeController : Controller { /// /// /// public IActionResult Index() { return View(); } /// /// Json /// /// Json public IActionResult GetJson() { return Json(new { Message = "This is a GetJson message!" }); } } }
そのコードは非常に簡単で、HomeControllerは2つのActionしかありません.
  • IndexというActionは、テスト
  • のための簡単なページを出力する.
  • GetJsonこのアクションは、クライアントブラウザ
  • にJsonオブジェクトを出力する.
     
    次に、ブラウザにUrlアドレス「Home/GetJson」を入力して、HomeControllerのGetJsonというアクションにアクセスします.結果は次のとおりです.
    ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中..._第1张图片
    IEブラウザの開発者ツールによって、ブラウザはHomeControllerのGetJsonというActionが返したJsonオブジェクトを正常に受信し、そのmessage属性値はGetJsonというActionで返した「This is is a GetJson message!」である.
     
    次に、MyActionFilterAttributeというIActionFilterブロッカーを定義し、IActionFilterのOnActionExecutedメソッドを使用して、HomeControlのGetJsonというActionメソッドが実行された後、GetJsonメソッドが返すJsonオブジェクトを置き換えることができます.using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using System; namespace AspNetCoreActionFilter.Filters { /// /// IActionFilter MyActionFilterAttribute /// public class MyActionFilterAttribute : Attribute, IActionFilter { /// /// IActionFilter.OnActionExecuted Controller Action /// public void OnActionExecuted(ActionExecutedContext context) { // Controller Action , ActionExecutedContext Result , Action Json context.Result = new JsonResult(new { Message = "This is a MyActionFilter message!" }); } /// /// IActionFilter.OnActionExecuting Controller Action , Action /// public void OnActionExecuting(ActionExecutingContext context) { //Do something... //context.Result = new EmptyResult();// IActionFilter.OnActionExecuting ,context Result null, Controller Action , IActionFilter OnActionExecuted , IActionFilter Filter } } }
     
    問題はASP.NET Core MVCがIActionFilterのOnActionExecutedメソッドを実行すると、HomeControllerのGetJsonというActionメソッドが返すJsonオブジェクトが、Http Responseに出力されてクライアントブラウザに送信されたのでしょうか?
     
    上で定義したIActionFilterブロッカーMyActionFilterAttributeをHomeControlのGetJsonメソッドに登録します.using AspNetCoreActionFilter.Filters; using Microsoft.AspNetCore.Mvc; namespace AspNetCoreActionFilter.Controllers { public class HomeController : Controller { /// /// /// public IActionResult Index() { return View(); } /// /// Json /// /// Json [MyActionFilter] public IActionResult GetJson() { return Json(new { Message = "This is a GetJson message!" }); } } }
    次にブラウザにUrlアドレス「Home/GetJson」を入力してHomeControllerのGetJsonというアクションにアクセスします.
    ASP.NET Core MVC中的IActionFilter.OnActionExecuted方法执行时,Controller中Action返回的对象是否已经输出到Http Response中..._第2张图片
    今回のブラウザで受信したJsonオブジェクトは、MyActionFilterAttributeブロッカーのOnActionExecutedメソッドで置き換えられたJsonオブジェクトであり、そのmessageプロパティ値は「This is is is a MyActionFilter message!」であり、HomeControllerのGetJsonというActionが返すJsonオブジェクトはブラウザにまったく受信されず、HomeControllerのGetJsonというActionが返すJsonオブジェクトがHttp Responseに出力されてクライアントブラウザに送信されていないことを示している.だからこれはASPをよく説明しています.NET Core MVCにおけるIActionFilterブロッキングのOnActionExecutedメソッドは、ControllerのActionから返されたオブジェクトがHttp Responseに出力される前に実行されます.
     
    ASPでもNET Core MVCの.cshtmlビューファイルにC#コードをいくつか書くブレークポイントを打つ、IActionFilterブロッキングのOnActionExecutedメソッドにもブレークポイントを打つ、Visual Studioデバッグでは、IActionFilterブロッキングのOnActionExecutedメソッドのブレークポイントが先に実行されてから実行することがわかる.cshtmlビューファイルのブレークポイントは、上の黒い太字の観点を明確に証明しています.もちろんControllerのアクションメソッドでResponseを直接使用するとBodyのStreamストリームはクライアントブラウザにデータを出力し、IActionFilterブロッカーのOnActionExecutedメソッドが実行されると、データはクライアントブラウザに送信されたに違いない.
     
    転載先:https://www.cnblogs.com/OpenCoder/p/9835989.html