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);
}
}
パラメータ分離.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
public abstract class ParameterBindingAttribute : Attribute
{
protected ParameterBindingAttribute();
public abstract HttpParameterBinding GetBinding(HttpParameterDescriptor parameter);
}
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);
}
では、振り返って、前の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);
}
}
パラメータ分離.
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);
}
}
パラメータ分離.
public class HttpActionBinding
{
public HttpActionBinding();
public HttpActionBinding(HttpActionDescriptor actionDescriptor, HttpParameterBinding[] bindings);
public HttpActionDescriptor ActionDescriptor { get; set; }
public virtual Task ExecuteBindingAsync(HttpActionContext actionContext, CancellationToken cancellationToken);
}
}