首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ExecuteResultAsync(ActionContext)方法的用法是什么?

ExecuteResultAsync(ActionContext)方法的用法是什么?
EN

Stack Overflow用户
提问于 2019-12-18 09:06:07
回答 1查看 7K关注 0票数 2

在webapi/mvc控制器中,Controller将返回一个ActionResult<T>类型,并且它有一个ExecuteResultAsync(ActionContext)方法。

ExecuteResultAsync(ActionContext)方法的用法是什么?MVC将如何使用该方法?在它中,ActionContext参数来自哪里?从Http请求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-19 10:33:44

ExecuteResultAsync(ActionContext)方法的用法是什么?

  1. IActionResult,控制器动作方法返回的结果(对象)。ASP.NET核心通过调用IActionResult::ExecuteResultAsync(ActionContext)方法来执行这个结果。
  2. Action方法可能返回不同类型的JsonResult (在执行时向客户端发送json )、BadRequestResult(which在执行时发送400响应等。
  3. 您还可以创建自己的IActionResult实现。请注意,ExecuteResultAsync(ActionContext)方法应该将字节写入HTTP 。例如,我创建了一个返回CSV文件供您参考。这是一个简单的实现,不包含太多复杂的逻辑。 一些操作结果相当复杂,因为它们引入了一个新的IActionResultExecutor<TResult>接口来处理这些过程,例如,ObjectResult使用了一个IActionResultExecutor<ObjectResult>来处理这些过程。在创建自己的实现时,是否使用IActionResultExecutor<ObjectResult>取决于您。

MVC将如何使用该方法?

  1. WebApp开发人员不需要手动调用此IActionResult::ExecuteResultAsync(ActionContext)方法。这是MVC/RazorPage子系统将调用的方法。
  2. 如果您感兴趣,整个过程是:
    • 收到的请求
    • 将当前请求与预定义的路由(路由表或图形)匹配。如果匹配:
      • 我们知道控制器名称、操作名称和其他路由数据。
      • 由于我们已经知道控制器名称和操作名称,ASP.NET Core生成了一个ActionDescriptor实例,该实例描述了目标C#操作方法,例如参数。

代码语言:javascript
复制
- 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,如下所示:( 见源代码)

代码语言:javascript
复制
// 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(); 
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59388629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档