ASP.NET WebAPI 05パラメータバインド

5037 ワード


ParameterBindingAttribute


前編ではModelBinderAttributeの使用シーンを重点的に解説しています.この記事では、ModelBinderの背後にあるパラメータバインドの原理について詳しく説明します.
ModelBinderAttributeはParameterBindingAttributeから継承され、名前からParameterBindingAttributeがActionパラメータをバインドする特性であることがわかります.ModelBinderAttributeのほか、WebAPIではValueProviderAttribute、FromUriAttribute、FromBodyAttributeの3つのParameterBindingAttribute派生クラスも定義されています.
 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
    public abstract class ParameterBindingAttribute : Attribute
    {
        protected ParameterBindingAttribute();
        public abstract HttpParameterBinding GetBinding(HttpParameterDescriptor parameter);
}

 
  
 
 
ParameterBindingAttributeはGetBindingメソッドのみを提供し、このメソッドはHttpParameterBindingタイプのオブジェクトを返します.HttpParameterBindingはパラメータバインドプロセスのコアクラスであり、要求データからパラメータバインドに読み込むプロセス全体を基本的に完了します.
 
ここではHttpParameterDescriptorに注目する必要があります.パラメータの記述対象として、パラメータの情報が含まれています(詳細は後述します).
 
HttpParameterBinding
 
    public abstract class HttpParameterBinding
    {
        protected HttpParameterBinding(HttpParameterDescriptor descriptor);
        public HttpParameterDescriptor Descriptor { get; }        
        public virtual string ErrorMessage { get; }        
        public bool IsValid { get; }        
        public virtual bool WillReadBody { get; }

        public abstract Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken);
        
        protected object GetValue(HttpActionContext actionContext);

        protected void SetValue(HttpActionContext actionContext, object value);
}

 
  
 
 
ここで,ExecuteBindingAsync法は特定のパラメータバインドを実現する.UriとBodyからのデータはWillReadBodyで区別できますが、WillReadBodyのデフォルトはfalseです.
 

ModelBinderParameterBinding


 
では、振り返って、前のModelバインドを見てみましょう.
 
 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
    public class ModelBinderAttribute : ParameterBindingAttribute
    {
        public ModelBinderAttribute();
        public ModelBinderAttribute(Type binderType); 
        public Type BinderType { get; set; }
        public string Name { get; set; }
        public bool SuppressPrefixCheck { get; set; }
        public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter);      
        public IModelBinder GetModelBinder(HttpConfiguration configuration, Type modelType); 
        public ModelBinderProvider GetModelBinderProvider(HttpConfiguration configuration); 
        public virtual IEnumerable<System.Web.Http.ValueProviders.ValueProviderFactory> GetValueProviderFactories(HttpConfiguration configuration);
    }

 
  
 
 
 
ModelBinderParameterBindingではGetModelBinderProviderメソッドが定義されています.ModelBinderProviderでは、ModelBinderを取得するGetBinderメソッドを定義します.
ModelBinderは、Modelバインドを完了するベースクラスです.
 
ModelBinderAttribute
FromUriAttribute
ValueProviderAttribute

FormatterParameterBinding


Bodyのデータの場合、WebAPIは、データバインドのためのFormatterParameterBindingを提供します.Bodyが提供できるデータフォーマットはUriのように単一ではないため、Bodyは複雑なデータ構造をより便利に提供することができます.FormatterParameterBindingは、Bodyデータを逆シーケンス化してパラメータにバインドする機能を提供していることがネーミングからわかります.
MediaTypeFormatter
異なる要求データフォーマットの場合、FormatterParameterは、要求されたConent-Typeに従って、異なるシーケンス化オブジェクトを提供します.これらのシーケンス化処理タイプはMediaTypeFormatterに継承されます.
Content-TypeとMediaTypeFormatterの対応関係を列挙します.
Content-Type
MediaTypeFormatter
text/xml,application/xml
XmlMediaTypeFormatter
text/json,application/json
MediaTypeFormatter
application/x-www-form-urlencoded
FormUrlEncodedMediaTypeFormatter
application/x-www-form-urlencoded
JqueryMvcFormUrlEncodedFormatter
 
FromBodyAttribute
 

IActionValueBinder


 
public interface IActionValueBinder

 { 

HttpActionBinding GetBinding(HttpActionDescriptor actionDescriptor); 

 }

 
  
 
 
ポータルをバインドします.
 

HttpActionBinding


 
public class HttpActionBinding

 { 

 

public HttpActionBinding(); 

 

public HttpActionBinding(HttpActionDescriptor actionDescriptor, HttpParameterBinding[] bindings); 

public HttpActionDescriptor ActionDescriptor { get; set; } 

 

public virtual Task ExecuteBindingAsync(HttpActionContext actionContext, CancellationToken cancellationToken); 

 } 

}

 
  
 
 
パラメータ分離.