ASPを解読する.NET 5&MVC 6シリーズチュートリアル(15):MvcOptions構成
6114 ワード
プログラムモデル処理IApplicationModelConvention
ビューエンジンの管理
MvcOptionsのインスタンスオブジェクトには、システムのビューエンジンのセットを保存するためのViewEnginesプロパティがあります.たとえば、「カスタムViewビューファイル検索ロジック」の章では、このプロパティを使用して、独自のカスタムビューエンジンを実装できます.例は次のとおりです.
Web APIにおける入力(InputFormater)/出力(OutputFormater)
入力
Web APIと現在のMVCの入力パラメータの処理は、現在JSONとXML形式をサポートしており、具体的な処理類は以下の通りである.
しゅつりょく
Web APIでは、デフォルトの出力フォーマットには次の4つがあります.
上記の4種類はシステムにおいて、状況に応じて自動的に判断出力され、具体的な判断ルールは以下の通りである.
同様のアクションであれば、
次の方法であれば、同じ戻り文字列であり、戻りタイプが
上記の2種類のアクションがすべてでない場合、デフォルトでは
もちろん、
あるいは、ベースクラスController上でも、
もちろん、
Output CacheとProfile
MVC 6において、OutputCacheの特性は
上記の例では、ページの内容をクライアントに100秒間キャッシュし、言い換えれば、Response応答ヘッダに
属性名
説明
Duration
キャッシュ時間、単位:秒、例:
trueは
Vary headerヘッダの設定
Location
Cache-Controlをpublic、private、no-cacheに設定するなど、キャッシュの場所.
さらに、
他の私たちがよく知っている内容
以下の内容はよく知られているかもしれませんが、以前のMVCバージョンで使用されていたため、これらの内容はすべてMvcOptionsの属性として存在し、具体的な機能リストは以下の通りです(一つ一つ述べません):
FiltersModelBindersModelValidatorProvidersValidationExcludeFiltersValueProviderFactories
もう2つ:MaxModelValidationErrorsセットモデル検証は、表示される最大エラー数です.
RespectBrowserAcceptHeaderがWeb APIのコンテンツ協定機能を使用する場合、Accept Headerの定義を遵守するかどうかは、デフォルトではメディアタイプが
MvcOptions
のインスタンス・オブジェクトには、MVCプログラムの起動時に呼び出されるアプリケーション・モデルApplicationModelConventions
を処理するためのList
のタイプのインタフェース・セット(タイプ:IApplicationModelConvention
)があります.したがって、呼び出す前に変更または更新することができます.たとえば、すべてのControllerおよびActionについてデータベースで許可定義を行うことができます.プログラム起動時にデータ授権情報を読み出し、アプリケーションモデルApplicationModel
を処理する.例は次のとおりです.
public class PermissionCheckApplicationModelConvention : IApplicationModelConvention
{
public void Apply(ApplicationModel application)
{
foreach (var controllerModel in application.Controllers)
{
var controllerType = controllerModel.ControllerType;
var controllerName = controllerModel.ControllerName;
controllerModel.Actions.ToList().ForEach(actionModel =>
{
var actionName = actionModel.ActionName;
var parameters = actionModel.Parameters;
// , actionModel
});
// , ControllerModel
}
}
}
ビューエンジンの管理
MvcOptionsのインスタンスオブジェクトには、システムのビューエンジンのセットを保存するためのViewEnginesプロパティがあります.たとえば、「カスタムViewビューファイル検索ロジック」の章では、このプロパティを使用して、独自のカスタムビューエンジンを実装できます.例は次のとおりです.
services.AddMvc().Configure(options =>
{
options.ViewEngines.Clear();
options.ViewEngines.Add(typeof(ThemeViewEngine));
});
Web APIにおける入力(InputFormater)/出力(OutputFormater)
入力
Web APIと現在のMVCの入力パラメータの処理は、現在JSONとXML形式をサポートしており、具体的な処理類は以下の通りである.
JsonInputFormatter
XmlDataContractSerializerInputFormatter
しゅつりょく
Web APIでは、デフォルトの出力フォーマットには次の4つがあります.
HttpNoContentOutputFormatter
StringOutputFormatter
JsonOutputFormatter
XmlDataContractSerializerOutputFormatter
上記の4種類はシステムにおいて、状況に応じて自動的に判断出力され、具体的な判断ルールは以下の通りである.
同様のアクションであれば、
ApplicationModel
を使用して204、すなわちNoContentを返す.
public Task DoSomethingAsync()
{
// Task
}
public void DoSomething()
{
// Void
}
public string GetString()
{
return null; // null
}
public List GetData()
{
return null; // null
}
次の方法であれば、同じ戻り文字列であり、戻りタイプが
HttpNoContentOutputFormatter
のActionである場合にのみ、string
を使用して文字列を返す.戻りタイプがobjectのActionである場合、StringOutputFormatter
を使用してJSONタイプの文字列データを返します.
public object GetData()
{
return"The Data"; // JSON
}
public string GetString()
{
return"The Data"; //
}
上記の2種類のアクションがすべてでない場合、デフォルトでは
JsonOutputFormatter
を使用してJSONデータを返し、JsonOutputFormatter
フォーマットが次の文で削除された場合、JsonOutputFormatter
を使用してXMLデータを返します.
services.Configure(options =>
options.OutputFormatters.RemoveAll(formatter => formatter.Instance is JsonOutputFormatter)
);
もちろん、
XmlDataContractSerializerOutputFormatter
表示宣言を使用してProducesAttribute
フォーマットを使用することもできます.例は以下のとおりです.
public class Product2Controller : Controller
{
[Produces("application/json")]
//[Produces("application/xml")]
public Product Detail(int id)
{
return new Product() { ProductId = id, ProductName = " " };
}
}
あるいは、ベースクラスController上でも、
JsonOutputFormatter
を使用してもよい.例は以下の通りである.
[Produces("application/json")]
public class JsonController : Controller { }
public class HomeController : JsonController
{
public List GetMeData()
{
return GetDataFromSource();
}
}
もちろん、
ProducesAttribute
は、以下のようにグローバルに宣言することもできる.
services.Configure(options =>
options.Filters.Add(newProducesAttribute("application/json"))
);
Output CacheとProfile
MVC 6において、OutputCacheの特性は
ProducesAttribute
クラスによってサポートされ、例は以下の通りである.
[ResponseCache(Duration = 100)]
public IActionResult Index()
{
return Content(DateTime.Now.ToString());
}
上記の例では、ページの内容をクライアントに100秒間キャッシュし、言い換えれば、Response応答ヘッダに
ResponseCacheAttribute
ヘッダを追加し、Cache-Control
ヘッダを設定する.このプロパティでサポートされているプロパティのリストは次のとおりです.属性名
説明
Duration
キャッシュ時間、単位:秒、例:
max-age=100
NoStore trueは
Cache-Control:max-age=100
VaryByHeader Vary headerヘッダの設定
Location
Cache-Controlをpublic、private、no-cacheに設定するなど、キャッシュの場所.
さらに、
Cache-Control:no-store
は、グローバル設定のprofile情報構成を読み出してキャッシュできるように、ResponseCacheAttribute
e属性をサポートしています.例は以下の通りです.
[ResponseCache(CacheProfileName = "MyProfile")]
public IActionResult Index()
{
return Content(DateTime.Now.ToString());
}
public void ConfigureServices(IServiceCollection services)
{
services.Configure(options =>
{
options.CacheProfiles.Add("MyProfile",
new CacheProfile
{
Duration = 100
});
});
}
CacheProfileNam
のMvcOptions
属性値にCacheProfiles
という個性的な設定を追加することで、この構成情報はすべてのActionで使用することができる.他の私たちがよく知っている内容
以下の内容はよく知られているかもしれませんが、以前のMVCバージョンで使用されていたため、これらの内容はすべてMvcOptionsの属性として存在し、具体的な機能リストは以下の通りです(一つ一つ述べません):
FiltersModelBindersModelValidatorProvidersValidationExcludeFiltersValueProviderFactories
もう2つ:MaxModelValidationErrorsセットモデル検証は、表示される最大エラー数です.
RespectBrowserAcceptHeaderがWeb APIのコンテンツ協定機能を使用する場合、Accept Headerの定義を遵守するかどうかは、デフォルトではメディアタイプが
MyProfile
の場合、Accept headerは無視されます.trueに設定した場合は無視されません.