ASP.NET Coreアプリケーションの静的ファイル要求に対する処理[5]:DefaultFilesMiddlewareミドルウェアがデフォルトページを表示する方法

12058 ワード

DefaultFilesMiddlewareミドルウェアの目的は、ターゲットディレクトリの下にあるデフォルトファイルをレスポンスコンテンツとして使用することです.このデフォルトファイルが直接要求された場合、前述のStaticFileMiddlewareミドルウェアはこのファイルをクライアントに応答することを知っています.ディレクトリに対するリクエストをこのデフォルトファイルにリダイレクトできれば、すべてが解決されます.実際、DefaultFilesMiddlewareミドルウェアの実装ロジックは簡単で、現在要求されているアドレスをURL書き換えで変更し、ディレクトリのURLをデフォルトファイルのURLに変更します.[本文は『ASP.NET Coreフレームワークの秘密を明らかにする』に同期した]
まず、DefaultFilesMiddlewareタイプの定義を見てみましょう.他の2つのミドルウェアと同様に、DefaultFilesMiddlewareの構造には、関連する構成オプションを指定するためにIOptionsタイプのパラメータがあります.DefaultFilesMiddlewareミドルウェアは本質的に要求パスと物理ディレクトリのマッピングを体現しているため、DefaultFilesOptionsはSharedOptionsBaseに割り当てられています.DefaultFilesOptionsのDefaultNamesプロパティには、定義済みのデフォルトファイル名が含まれています.デフォルトには4つの名前(default.html、default.html、index.html、またはindex.html)が含まれています.
   1: public class DefaultFilesMiddleware
   2: {
   3:     public DefaultFilesMiddleware(RequestDelegate next, IHostingEnvironment hostingEnv, IOptions<DefaultFilesOptions> options);
   4:     public Task Invoke(HttpContext context);
   5: }
   6:  
   7: public class DefaultFilesOptions : SharedOptionsBase
   8: {
   9:     public IList<string> DefaultFileNames { get; set; }
  10:  
  11:     public DefaultFilesOptions() : this(new SharedOptions()){}
  12:     public DefaultFilesOptions(SharedOptions sharedOptions) : base(sharedOptions)
  13:     {
  14:         this.DefaultFileNames = new List<string> { "default.htm", "default.html", "index.htm", "index.html" };
  15:     }    
  16: }

このDefaultFilesMiddlewareタイプは、読者の友人が特定のリクエスト処理ロジックを理解できるように、比較的理解しやすい形式で再定義されています.次のコード・クリップに示すように、DefaultFilesMiddlewareとDirectoryBrowserMiddlewareはリクエストを検証します.現在のディレクトリの下にデフォルトファイルがある場合は、現在要求されているURLをこのデフォルトファイルへのURLに変更します.特筆すべきは、D e f a ultFilesMiddlewareミドルウェアは、ディレクトリへのアクセスを要求する要求ループ力を文字"/"で接尾辞にする必要があります.そうしないと、現在のパスに接尾辞が追加され、最終的なパスにリダイレクトが送信されます.
   1: public class DefaultFilesMiddleware
   2: {
   3:     private RequestDelegate         _next;
   4:     private DefaultFilesOptions     _options;
   5:   
   6:     public DefaultFilesMiddleware(RequestDelegate next, IHostingEnvironment env, IOptions<DefaultFilesOptions> options)
   7:     {
   8:         _next                     = next;
   9:         _options                  = options.Value;
  10:         _options.FileProvider     = _options.FileProvider ?? env.WebRootFileProvider;
  11:     }
  12:  
  13:     public async Task Invoke(HttpContext context)
  14:     {
  15:         //   GET HEAD  
  16:         if (!new string[] { "GET", "HEAD" }.Contains(context.Request.Method,StringComparer.OrdinalIgnoreCase))
  17:         {
  18:             await _next(context);
  19:             return;
  20:         }
  21:  
  22:         //                   
  23:         PathString path = new PathString(context.Request.Path.Value.TrimEnd('/') + "/");
  24:         PathString subpath;
  25:         if (!path.StartsWithSegments(_options.RequestPath, out subpath))
  26:         {
  27:             await _next(context);
  28:             return;
  29:         }
  30:  
  31:         //          
  32:         if (!_options.FileProvider.GetDirectoryContents(subpath).Exists)
  33:         {
  34:             await _next(context);
  35:             return;
  36:         }
  37:  
  38:         //              
  39:         foreach (var fileName in _options.DefaultFileNames)
  40:         {
  41:             if (_options.FileProvider.GetFileInfo($"{subpath}{fileName}").Exists)
  42:             {
  43:                 //        "/"    ,       “  ”URL    
  44:                 if (!context.Request.Path.Value.EndsWith("/"))
  45:                 {
  46:                     context.Response.StatusCode = 302;
  47:                     context.Response.GetTypedHeaders().Location = new Uri(path.Value + context.Request.QueryString);
  48:                     return;
  49:                 }
  50:                 //      URL          URL
  51:                 context.Request.Path = new PathString($"{context.Request.Path}{fileName}");
  52:             }
  53:         }
  54:         await _next(context);
  55:     }
  56: }

DefaultFileMiddlewareミドルウェアはURL書き換えでデフォルトファイルに応答するため、最終的にはStaticFileMiddlewareミドルウェアに依存してデフォルトファイルに応答するため、後者の登録に必要です.そのため、このミドルウェアは、StaticFileMiddleware応答ファイルの前にURL書き換えが発生することを保証するために優先的に登録する必要があります.
 
ASP.NET Coreアプリケーションの静的ファイル要求に対する処理[1]:静的ファイルASPをWeb形式で公開する.NET Coreアプリケーションの静的ファイル要求に対する処理[2]:条件要求と区間要求ASP.NET Coreアプリケーションの静的ファイル要求に対する処理[3]:StaticFileMiddlewareミドルウェアがファイル要求に対するASPをどのように処理するか.NET Coreアプリケーションの静的ファイル要求に対する処理[4]:DirectoryBrowserMiddlewareミドルウェアがディレクトリ構造ASPをどのように提示か.NET Coreアプリケーションの静的ファイル要求に対する処理[5]:DefaultFilesMiddlewareミドルウェアがデフォルトページを表示する方法