接着上文Asp.net web Api源码分析-Filter我们提到filter的获取和调用,后面通过HttpActionBinding actionBinding = actionDescriptor.ActionBinding;来获取HttpActionBinding实例,然后调用HttpActionBinding的ExecuteBindingAsync方法来绑定Action参数。HttpActionDescriptor中定义了ActionBinding属性,默认的实现代码:
ServicesContainer controllerServices = _controllerDescriptor.Configuration.Services;
IActionValueBinder actionValueBinder = controllerServices.GetActionValueBinder();
HttpActionBinding actionBinding = actionValueBinder.GetBinding(this);
这里的actionValueBinder默认就是一个DefaultActionValueBinder实例,然后调用它的GetBinding方法。然我们看看DefaultActionValueBinder的GetBinding方法:
public virtual HttpActionBinding GetBinding(HttpActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
{
throw Error.ArgumentNull("actionDescriptor");
}
HttpParameterDescriptor[] parameters = actionDescriptor.GetParameters().ToArray();
HttpParameterBinding[] binders = Array.ConvertAll(parameters, GetParameterBinding);
HttpActionBinding actionBinding = new HttpActionBinding(actionDescriptor, binders);
EnsureOneBodyParameter(actionBinding);
return actionBinding;
}
这里首先获取当前HttpActionDescriptor的参数集合ReflectedHttpParameterDescriptor[],然后依次调用GetParameterBinding方法把当前HttpActionDescriptor转化为HttpParameterBinding,GetParameterBinding方法如下:
protected virtual HttpParameterBinding GetParameterBinding(HttpParameterDescriptor parameter)
{
// Attribute has the highest precedence
// Presence of a model binder attribute overrides.
ParameterBindingAttribute attr = parameter.ParameterBinderAttribute;
if (attr != null)
{
return attr.GetBinding(parameter);
}
// No attribute, so lookup in globa