在webapi/mvc控制器中,Controller将返回一个ActionResult<T>类型,并且它有一个ExecuteResultAsync(ActionContext)方法。
ExecuteResultAsync(ActionContext)方法的用法是什么?MVC将如何使用该方法?在它中,ActionContext参数来自哪里?从Http请求?
发布于 2019-12-19 10:33:44
ExecuteResultAsync(ActionContext)方法的用法是什么?
IActionResult是,控制器动作方法返回的结果(对象)。ASP.NET核心通过调用IActionResult::ExecuteResultAsync(ActionContext)方法来执行这个结果。JsonResult (在执行时向客户端发送json )、BadRequestResult(which在执行时发送400响应等。IActionResult实现。请注意,ExecuteResultAsync(ActionContext)方法应该将字节写入HTTP 。例如,我创建了一个返回CSV文件供您参考。这是一个简单的实现,不包含太多复杂的逻辑。
一些操作结果相当复杂,因为它们引入了一个新的IActionResultExecutor<TResult>接口来处理这些过程,例如,ObjectResult使用了一个IActionResultExecutor<ObjectResult>来处理这些过程。在创建自己的实现时,是否使用IActionResultExecutor<ObjectResult>取决于您。MVC将如何使用该方法?
IActionResult::ExecuteResultAsync(ActionContext)方法。这是MVC/RazorPage子系统将调用的方法。ActionDescriptor实例,该实例描述了目标C#操作方法,例如参数。
- Since ASP.NET Core has known the Controller/Action and routes data, it creates an instance of **`IActionInvoker`** to invoke that action method pipline (including the filters, for more details, see [official docs](https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/filters?view=aspnetcore-3.1)):
- Action Method returns an instance of `IActionResult`
- Before invoking the `IActionResult::ExecuteResultAsync(ActionContext)`, invoke Result Filters `OnResultExecuting()` method.
- invoke `IActionResult::ExecuteResultAsync(ActionContext)`
- After that, invoke the Result Filters `OnResultExecuted()` method.
ActionContext参数从哪里来?从Http请求?
首先,HttpContext是由底层服务器构建的。它包含一个模仿HTTP请求的Request属性。
接下来,在选择操作之后,我们将得到另外两个对象:
RouteData:路由数据,例如当前area名称、当前page名称等。ActionDescriptor:对与当前路由匹配的当前操作的描述。使用上述三个对象,ASP.NET Core通过简单地新建ActionContext来创建它。例如,IRouter-based路由系统创建一个actionContext,如下所示:( 见源代码)
// create action context
var actionContext = new ActionContext(context.HttpContext, routeData, actionDescriptor);
// create action invoker
var invoker = _actionInvokerFactory.CreateInvoker(actionContext);
if (invoker == null){ throw ...;}
// invoke the pipeline
return invoker.InvokeAsync(); https://stackoverflow.com/questions/59388629
复制相似问题