ASP.NET WebAPI 10 Actionの選択(二)

3992 ワード

本シリーズの第2編では、Actionの選択条件について簡単に述べた本編では、Actionの選択過程について詳しく述べた.前編では、Controllerのアクティブ化過程でControllerを設定するController Contextについて述べ、次にHttpControllerを呼び出すExectuteAsync方法について述べた.この方法では,HttpActionDescriptorを選択し,パラメータバインドを行い,Acitonを実行する2つのステップに大別できる.
 

HttpActionDescriptor


HttpControllerDescriptorのように、HttpActionDescriptorにもActionの基本情報が保存されています.実行方法(ExecuteAsync)が提供されています.
 
public abstract class HttpActionDescriptor

 { 

public abstract string ActionName { get; } 

public HttpConfiguration Configuration { get; set; } 

public HttpControllerDescriptor ControllerDescriptor { get; set; } 

public virtual ConcurrentDictionary<object, object> Properties { get; } 

public abstract Type ReturnType { get; } 

public virtual Collection<Net.Http.HttpMethod> SupportedHttpMethods { get; } 

public abstract Task<object> ExecuteAsync(HttpControllerContext controllerContext, IDictionary<string, object> arguments, CancellationToken cancellationToken); 

public virtual Collection<T> GetCustomAttributes<T>() where T : class; 

public virtual Collection<T> GetCustomAttributes<T>(bool inherit) where T : class; 

public virtual Collection<Filters.IFilter> GetFilters(); 

 }

 
HttpControllerDescriptorと同様に、ConfigurationもGlobalConfigurationを参照する.コンフィギュレーション、ActionName、ReturnTypeはそれぞれActionの名前と戻り値を表します.SupportedHttpMethodsは、ActionがサポートできるHttpMethodの集合を表す.HttpActionDescriptorには、HttpActionDescriptorにデータを追加する読み取り専用プロパティがあります.
 
WebAPIにおけるHttpActionDescriptorのデフォルト派生クラスは、ReflectedHttpActionDescriptorです.
 
public class ReflectedHttpActionDescriptor : HttpActionDescriptor

 { 

public MethodInfo MethodInfo { get; set; } 

}

 
 
 
HttpActionDescriptorの場合、ReflectedHttpActionDescriptorには1つのMethodInfoしか追加されていません.ReflectedHttpActionDescriptorのネーミングとMethodInfoプロパティから、ReflectedHttpActionDescriptorがActionを反射的に実行することが考えられます.
 

HttpParameterDescriptor


Actionのパラメータについては、Actionの選択に参加するだけでなく、WebAPIを行う際にもパラメータをバインドする際に複雑な論理があるため、WebAPIはActionのパラメータ、すなわちHttpParameterDescriptorをカプセル化している.
 
public abstract class HttpParameterDescriptor

 { 

public HttpActionDescriptor ActionDescriptor { get; set; } 

public HttpConfiguration Configuration { get; set; } 

public virtual object DefaultValue { get; } 

public virtual bool IsOptional { get; } 

public virtual ParameterBindingAttribute ParameterBinderAttribute { get; set; } 

public abstract string ParameterName { get; } 

public abstract Type ParameterType { get; } 

public virtual string Prefix { get; } 

public ConcurrentDictionary<object, object> Properties { get; } 

public virtual Collection<T> GetCustomAttributes<T>() where T : class; 

 }

 
 
 
 
HttpActionDescriptorでのGetParametersメソッドは、Actionの下にあるHttpParameterDescriptorのセットを返すことです.
WebAPIにおけるHttpParameterDescriptorの派生クラスはReflectedHttpParameterDescriptorである.
 
 

HttpActionSelector


HttpActionSelectorもWebAPIの「標準化コンポーネント」であり、その名の通りActionを検索するために使用されます.
 
public interface IHttpActionSelector

{ 

ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor); 

HttpActionDescriptor SelectAction(HttpControllerContext controllerContext); 

}

 
 
 
HttpControllerSelector、IHttpActionSelectorとも、2つの方法を提供しています.GetActionMaping、SelectActionは、それぞれControllerの下のすべてのActionと要求のActionを返すために使用されます.
 
反射は解析方法の場合に相対的に時間のかかる操作であるため,ReflectionActionDescriptorもキャッシュした.