Asp.Netコア・ミドルウェア・アプリケーションは、あなたが知らないそれらの事を練習します

I.概要

この記事を共有するEndpointルーティングエンドポイント中间件ではない、それがどのように機能するかについては、シナリオと実践例を学生が作品を理解する必要がある場合、
あなたは記事の以下の解釈の2を参照してくださいするにはここをクリックすることができます:

ミドルウェア(ミドルウェア)の1.1役割の

私たちは、ウェブフレームのいずれかがHTTP要求パイプラインにカプセル化されていることを知って、要求は一連の操作パイプラインを通じてあるたびに、私たちは、最終的なコードを記述します。次いで、ミドルウェア・アプリケーションは、処理中の要求および他のいくつかの応答をインターセプトするためのパイプラインの構成要素です。ミドルウェアは、多くのことができ、各ブローカは、それが次のミドルウェアへの転送を要求するかどうかを決定することができ、パイプライン要求に傍受することができます。

asp.netコアが提供IApplicationBuilderasp.netパイプラインにミドルウェア登録要求を移動していた可能インターフェースを、ミドルウェアが典型的であるAOPアプリケーション。以下は、Microsoftの公式ミドルウェア・パイプライン要求のマップです。

1.2とフィルタミドルウェアの違い

FilterASP.NET MVCは、許可フィルター、リソースフィルター、アクションフィルタはそれぞれ、フィルターの5を保持し、製品の継続である 、例外フィルタと結果フィルター。
詳細については、私の最後の共有参照してください簡単な言葉でそれらのものをAsp.Netコアフィルターを-AOP記事を。

説明によると、それは同様のミドルウェアやフィルタ機能を見ることができ、その後、その違いは何ですか?なぜ彼らはミドルウェアに従事していますか?
実際には、フィルタとの懸念が同じではないミドルウェア、それは同じ義務ではない、物事をすることは同じではありません。

2と同じAOP武器Filterアプリケーション自体に焦点を当てて(フィルタ)よりフィッティングビジネス、そのようなあなたが見るようにActionFilterし、ResultFilterそれを直接、あなたはActionActionResult相互作用が、私はいくつかを持っていることをあなたに近い感じではありません例えば、私の出力はのViewModelにデータ検証のための私の要求にフォーマットされますが、必ずそれは間違いなくフィルターであること。それは、MVCの一部であり、それはこの能力を持っていないいくつかのあなたのアクションのコンテキストに関する情報、およびミドルウェアを傍受することができます。

各ミドルウェアはリクエストの前後に操作することができ、見ることができます。次のリクエストに渡された要求が処理された後

1.3ミドルウェアの利用シナリオ

ミドルウェアにそれを使用するので、?私の理解では、ように、認証、セッションの保存、ログとして、それらとのビジネス関係を行うにはないいくつかの我々のアプリケーションにパイプラインで使用することができるということである、と。実際には、私たちのAsp.netコアプロジェクト自体はすでにミドルウェアの数が含まれています。このようなアイデンティティミドルウェア、などUseAuthorization()と他のシリーズ。

第二に、ミドルウェアの戦闘

需要シナリオ:必要なのいくつかを除外することが必要ながら、記録の終了により、すべてのアクセス要求をログに記録しControllerたりAction、レコードの情報をログに記録が要求されていません。

思考は:分析後、私は、ルーティングインターセプトにグローバルなミドルウェアを作成する必要があり、およびログに書き込まれ、また、機能を追加する必要がありAttribute、それらをマークするControllerか、Actionログインする必要はありません。

さんが作成してみましょうLogsMiddlewareミドルウェアのコードを以下のように、コードは次のとおりです。

public class LogsMiddleware
{
        private readonly RequestDelegate _next;

        public LogsMiddleware(RequestDelegate next)
        {
            this._next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            var endpoint = context.Features.Get<IEndpointFeature>()?.Endpoint;
            if (endpoint == null)
            {
                await _next(context);
                return;
            }

            using (var scope = context.RequestServices.CreateScope())
            {
                var _logger = scope.ServiceProvider.GetService<ILogger<LogsMiddleware>>();

                var attruibutes = endpoint.Metadata.OfType<NoLogsAttriteFilter>();
                if (attruibutes.Count()==0)
                {
                    _logger.LogInformation($" url:{context.Request.Path}, 访问时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
                }

                //记录 排除的特殊Message 信息
                foreach (var attribute in attruibutes)
                {
                    _logger.LogInformation(attribute.Message);
                }
            }
            await _next(context);
        }
}

NoLogsAttriteFilter フィルタ・コードは次の通りであります:

public class NoLogsAttriteFilter : Attribute
{
        /// <summary>
        /// 这里加这个主要是把获取到的信息在中间件中打印出来,区分中间件的拦截用处
        /// </summary>
        public string Message = "";

        public NoLogsAttriteFilter(string message)
        {
            Message = message;
        }
}

Startup コードは以下の通りであります:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            app.UseRouting();
            app.UseAuthorization();
            app.UseMiddleware<LogsMiddleware>();//添加日志记录中间件
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
}

HomeController 次のようにアクション2つのコントローラコードは::

// 访问该路由会记录访问日志
public IActionResult Index()
{
        return View();
}

//访问该路由不会记录访问日志
[NoLogsAttriteFilter("Manage 不需要记录访问日志")]
public IActionResult Manage()
{
       return View();
}

私たちがして、コードミドルウェアから見ることができます。私はすべての業務の独立性は、システム内に存在に依存しない必要がある上に、このカスタムログミドルウェアが完了しているcontext.Features.Get<IEndpointFeature>()?.Endpoint;エンドポイントのマッチング方法をルーティング取得、およびによってendpoint.Metadata.OfType<NoLogsAttriteFilter>()道取得Action財産情報データを、そして私の必要性がで遮ら
カスタムミドルウェア、ハウツー記事、クリックしてくださいミドルウェアの公式のチュートリアルカスタマイズの記事を。

今、私は上の記事の下に証明しましょう読んAsp.Netコアエンドポイントエンドポイントルーティング作品の記事が言及したUseRouting()ミドルウェアがすべてトラバースすることでEndpoint現在のルーティング要求と一致するようにエンドポイントをEndpointエンドポイントルーティングが言った、私が登録LogsMiddleware真ん中をメンバーとUseRouting()次のようにルーティングは、ミドルウェアコードシーケンスを調整します。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                app.UseHsts();
            }

            // 中间件注册放到了UseRouting() 之前
            app.UseMiddleware<LogsMiddleware>();//添加日志记录中间件
            
            app.UseRouting();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
            });
}

デバッガを実行した結果で見てみましょうが示されています:
結果をデバッグ実行します

結果を図で見ることができるから、デバッグendpoint変数はnullです。へのすべての必要性Endpointのエンドポイント・ルーティングが登録されている必要がありUseRouting()ミドルウェア後。

第三に、公式の共通ミドルウェア

  1. 例外/エラー処理
    :ときにアプリケーションが開発環境で実行されている場合
    (開発者の異常ページミドルウェアUseDeveloperExceptionPageアプリケーション実行時エラーを報告します)。
    データベースミドルウェアランタイムを報告するエラーデータベース・エラー・ページ。
    アプリケーションは、本番環境で実行されている場合:
    例外ハンドラミドルウェア(UseExceptionHandler)キャプチャ異常は、ミドルウェアによって引き起こされます。
    HTTP厳格なトランスポート・セキュリティ・プロトコル(HSTS)ミドルウェア(UseHsts)を加え厳密・トランスポート・セキュリティ・ヘッダ。
  2. HTTPSリダイレクトミドルウェア(UseHttpsRedirectionHTTPS)にリダイレクトHTTPリクエスト。
  3. 中間静的ファイル(UseStaticFiles)静的ファイルを返し、さらに要求の処理を簡略化します。
  4. クッキーポリシーミドルウェア(UseCookiePolicy)EU一般データ保護規則(GDPR)の規定に準拠アプリケーション。
  5. (ミドルウェアをルーティングするための要求をルーティングUseRouting)。
  6. 認証ミドルウェア(UseAuthentication)セキュアなリソースへのユーザーアクセスを許可する前にユーザーを認証するための試み。
  7. アクセス安全なリソースへの許可されたユーザのためのミドルウェアを許可(UseAuthorization)。
  8. セッションミドルウェア(UseSessionセッション状態を確立し、維持するために)。アプリケーションは、クッキーポリシーミドルウェア後にセッションミドルウェアを呼び出す前に、セッションの状態、およびミドルウェアMVCを使用している場合。
  9. 以下のための手段Razor Pages(MapRazorPagesと中間パイプをルーティングするエンドポイントを要求するエンドポイントに追加しますUseEndpoints)。

あなたが良いを感じた場合は、マイクロチャンネルスキャンコードに焦点を当ててください[パブリック]博士DOTNET番号は、フォローアップは、共有へのあなたがよりエキサイティング持参します

間違った場所よりも多く存在する場合は、正しい正を喜ばご支援ありがとうございました!

おすすめ

転載: www.cnblogs.com/jlion/p/12430522.html