ASP.NET Core入門チュートリアル9、ASP.NET Coreミドルウェア入門


一、前言
1、この教程の主な内容
  • ASP.NET Coreミドルウェア紹介
  • カスタムASP.NET Coreミドルウェア実装要求チェック
  • 2、このチュートリアルの環境情報
    ソフトウェア/環境
    説明
    オペレーティングシステム
    Windows 10
    SDK
    2.1.401
    ASP.NET Core
    2.1.3
    MySQL
    8.0.x
    IDE
    Visual Studio Code 1.32.3
    エクスプローラ
    Chrome 70
    VSコードカード
    バージョン#バージョン#
    説明
    C#
    1.17.1
    C#インテリジェントな感知を提供する.NET Coreデバッグ、コンパイルなど
    vscdoe-solution-explorer
    0.3.1
    ソリューションビューの提供
    このコードは以下のコードで調整されます.https://github.com/ken-io/asp...
    3、前置き知識
    必要な事前知識
  • C#委任(Delegate)
  • http://www.runoob.com/csharp/...
  • C#拡張方法
  • https://docs.microsoft.com/zh...
    二、ASP.NET Coreミドルウェアの紹介
    1、ASP.NET Coreミドルウェアの基本説明
    ASP.NET Core MVCアプリケーションがKestrelからリクエストを受信すると、HttpContextが確立され、Applicationによってリクエストが処理されます.アプリケーションには、その要求を処理するチャネルがあります.これがASPです.NET Coreパイプは、通常、要求処理パイプと呼ばれます.
    このパイプには、要求を秩序正しく処理する一連のコンポーネントがあり、ミドルウェアである.
    図中の青い部分はシステム内蔵の比較的前のミドルウェアまたは私たちがカスタマイズしたミドルウェアと考えることができ、MVCは特殊なミドルウェアであり、通常は最後に置かれているので、ここでは単独で描く.
    MVCミドルウェアの場合、要求されたURLがルーティングと一致する場合、後続のミドルウェアは有効になりません.だからMVCは通常最後に置かれます.
    ASP.NET Coreには、認証、静的ファイル処理、MVCなどのミドルウェアが内蔵されています.各ミドルウェアは、リクエストを受信した後、次のミドルウェアによって処理されるか、結果を直接返すかを選択できます.例:
  • 認証ミドルウェア認証が通過しない場合、ログインページ
  • に直接起動する.
  • 静的ファイルミドルウェアは、静的ファイルと判断する静的ファイル内容
  • を直接返す.
    したがって、ミドルウェアは、パイプ内のリクエストプロセッサの処理を要求すると理解することができる.カスタムミドルウェアをパイプに登録することで、リクエストに介入することもできます.
    2、ASP.NET Coreミドルウェアベース使用
    プログラムでは,ミドルウェアは依頼に基づいて構築される.アプリケーション起動時にIApplicationBuilderを介してチャネルに登録します.
    具体的には、起動クラスStartup.csを参照してください.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseMvc(routes =>
        {
            //      
            routes.MapRoute(
                name: "Default",
                template: "{controller}/{action}",
                defaults: new { controller = "Home", action = "Index" }
            );
        });
    }
    UseDeveloperExceptionPageUseMvcは、いずれもインターフェースIApplicationBuilderの拡張方法である.
    三、ASPを使用する.NET Coreミドルウェア実装要求チェックアウト
    もしあなたが開発したAPIが携帯電話のAppのためにサービスしているならば、あなたのAPIは必ず公網に暴露しなければなりません.もし誰かがAPIアドレスを手に入れて不法に要求したり、ユーザー情報を取得したり、データを改ざんしたりすると、ユーザーのプライバシー、データが損なわれます.これは安全ではありません.クライアントが要求するときに署名を携帯しなければならないようにし、サーバ側の認証(署名の検証)が通過してから放行することで、安全になります.
    1、チェックマークミドルウェアの作成
    プロジェクトKen.Tutorial.WebにディレクトリMiddlewaresを作成し、クラスTokenCheckMiddleware.csを作成します.
    using System;
    using System.Security.Cryptography;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Http;
    
    namespace Ken.Tutorial.Web.Middlewares
    {
        public class TokenCheckMiddleware
        {
            private readonly RequestDelegate _next;
            public TokenCheckMiddleware(RequestDelegate requestDelegate)
            {
                this._next = requestDelegate;
            }
    
            public Task Invoke(HttpContext context)
            {
                //  Url token,       Form    token
                var token = context.Request.Query["token"].ToString() ?? context.Request.Form["token"].ToString();
                if (string.IsNullOrWhiteSpace(token))
                {
                    //       token  ,     token missing
                    return context.Response.WriteAsync("token missing");
                }
                //   1        
                var minute0 = DateTime.Now.AddMinutes(-1).ToString("yyyy-MM-dd HH:mm");
                var minute = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
                // token                  MD5    ,        
                if (token == MD5Hash(minute) || token == MD5Hash(minute0))
                {
                    return _next.Invoke(context);
                }
                //  token       token error
                return context.Response.WriteAsync("token error");
            }
    
            public string MD5Hash(string value)
            {
                using (var md5 = MD5.Create())
                {
                    var result = md5.ComputeHash(Encoding.ASCII.GetBytes(value));
                    var strResult = BitConverter.ToString(result);
                    return strResult.Replace("-", "");
                }
            }
        }
    }

    カスタムミドルウェアに重点を置いているため、すべてのチェックマークの論理は非常に簡単で、実際のプロジェクトで使用すれば、自分のニーズに合わせて調整することができます.
    2、拡張方法の作成Middlewaresディレクトリの下でクラスを新規作成:MiddlewareExtension.cs
    using Microsoft.AspNetCore.Builder;
    
    namespace Ken.Tutorial.Web.Middlewares
    {
        public static class MiddlewareExtension
        {
            public static IApplicationBuilder UseTokenCheck(this IApplicationBuilder builder)
            {
                return builder.UseMiddleware();
            }
        }
    }

    ここでは、拡張方法により、TokenCheckMiddlewareをインタフェースIApplicationBuilderに掛ける
    3、ミドルウェア登録/参照
    起動クラスStartup.csConfigureメソッドにおける中間部品の登録/参照
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        
        //      
    
        app.UseTokenCheck();
        
        app.UseMvc(routes =>
        {
            //        
        });
    }

    拡張方法が少し余計だと思ったら、UseMiddleware方法で直接登録することもできます
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        
        //      
    
        app.UseMiddleware();
        
        app.UseMvc(routes =>
        {
            //        
        });
    }
        

    ここで注意したいのは、MVCアプリであれば、MVCというミドルウェアを必ず最後の登録としてください.ミドルウェアは登録順に呼び出されるからです.MVCの後に置かれ、要求されたURLにも対応するルーティングが適切であれば、要求全体がMVCに引き継がれる.後ろのミドルウェアは呼び出されません.
    4、チェックマークミドルウェアテスト
    アプリケーションを起動し、異なる状況でのアクセス結果を検証します.
    URL
    Response
    localhost:5001
    token missing
    localhost:5001?token=test
    token error
    localhost:5001?token=3D76FEA1D0ADD0C7639B73023436C6EA
    Hello World ! -ken.io
    テストを容易にするために、MD 5ハッシュの値をオンラインで生成できます.ttp://tool.chinaz.com/tools/md5.aspx
    現在の分、例えば2019-03-27 23:23をMD 5を介してオンラインで生成すると3D76FEA1D0ADD0C7639B73023436C6EAになります.
    四、備考
  • 本明細書のコード例
  • https://github.com/ken-io/asp...
  • 本明細書では
  • を参照
    https://docs.microsoft.com/zh...
  • 拡張読書
  • https://www.cnblogs.com/artec...
    この記事は、私の独立したブログに掲載されています.https://ken.io/note/asp.net-c...