Asp.net web Api源码分析-Action的执行

本文深入探讨了ASP.NET Web API中Action的执行过程,从`ApiControllerActionInvoker`的`InvokeActionAsync`方法开始,详细分析了`ExecuteAsync`、`PrepareParameters`和`ExtractParameterFromDictionary`等关键步骤,揭示了参数绑定、异常处理及返回值转换的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

紧接着上文 Asp.net web Api源码分析-HttpParameterBinding 我们已经把Action调用的参数准备好了,现在就该开始调用Action了,这里的InvokeActionWithActionFilters(ApiController的ExecuteAsync方法)主要就是负责调用ActionFilters和Action的,这里的调用模式和mvc中的调用方式一致。这里filiter的调用就不多说,我们来看看Action的调用

controllerServices.GetActionInvoker().InvokeActionAsync(actionContext, cancellationToken);

在DefaultServices中有如下代码 SetSingle<IHttpActionInvoker>(new ApiControllerActionInvoker());所以我们知道实际调用Action是在ApiControllerActionInvoker的InvokeActionAsync方法。ApiControllerActionInvoker的InvokeActionAsync方法主要就一句

  return actionDescriptor.ExecuteAsync(controllerContext, actionContext.ActionArguments, cancellationToken)
                                       .Then(value => actionDescriptor.ResultConverter.Convert(controllerContext, value), cancellationToken);

这里的actionContext.ActionArguments是一个字典数据,key是参数名称,value参数值。

我们知道actionDescriptor这里是一个ReflectedHttpActionDescriptor实例,其ExecuteAsync方法主要代码实现如下:


  public override Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments, CancellationToken cancellationToken)
        {
            return TaskHelpers.RunSynchronously(() =>
            {
                object[] argumentValues = PrepareParameters(arguments, controllerContext);
                return _actionExecutor.Value.Execute(controllerContext.Controller, argumentValues);
            }, cancellationToken);
        }

其中PrepareParameters方法主要是取出Action方法所需参数的值,并且还要做一些检查,PrepareParameters实现如下:

 private object[] PrepareParameters(IDictionary<string, object> parameters, HttpControllerContext controllerContext)
        {
            // This is on a hotpath, so a quick check to

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值