ASPを解読する.NET 5&MVC 6シリーズチュートリアル(15):MvcOptions構成

6114 ワード

プログラムモデル処理IApplicationModelConventionMvcOptionsのインスタンス・オブジェクトには、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=100NoStore
trueはCache-Control:max-age=100VaryByHeader
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
   });
 });
}
CacheProfileNamMvcOptions属性値にCacheProfilesという個性的な設定を追加することで、この構成情報はすべてのActionで使用することができる.
他の私たちがよく知っている内容
以下の内容はよく知られているかもしれませんが、以前のMVCバージョンで使用されていたため、これらの内容はすべてMvcOptionsの属性として存在し、具体的な機能リストは以下の通りです(一つ一つ述べません):
FiltersModelBindersModelValidatorProvidersValidationExcludeFiltersValueProviderFactories
もう2つ:MaxModelValidationErrorsセットモデル検証は、表示される最大エラー数です.
RespectBrowserAcceptHeaderがWeb APIのコンテンツ協定機能を使用する場合、Accept Headerの定義を遵守するかどうかは、デフォルトではメディアタイプがMyProfileの場合、Accept headerは無視されます.trueに設定した場合は無視されません.