ASPでの使用方法Net Coreでの使用条件ミドルウェア

5065 ワード

ASP.Net Coreはマイクロソフトのオープンソースのプラットフォーム、拡張性、軽量レベルのモジュール化フレームワークであり、高性能なWebアプリケーションの構築に使用できます.ミドルウェアアセンブリはASPに注入することができる.Net Coreリクエストパイプラインでは、RequestとResponseのカスタマイズと変更が実現されます.
ASP.Net Coreミドルウェアは、Pipelineに流れるRequestおよびResponseをチェック、ルーティング、または変更するために使用することができる.この論文では、これらのミドルウェアを使用して、いくつかの高度な操作を実現する方法について説明します.

Use,Run,Mapメソッドの紹介


Use,Map,RunメソッドはHTTP Pipelineパイプラインを一緒に構築するのによく使われていますが、これらのメソッドとその用途をすばやく見てみましょう.
  • Use

  • この方法は1つの依頼を実行し、その後、 をPipelineの次のミドルウェアに渡す.この方法は を短い間持っているので、 に使用することができる.
  • Run

  • このメソッドは、委任を実行し、結果を返します.
  • Map

  • このメソッドは、条件付きで依頼を実行し、結果を返します.

    登録ミドルウェア


    ミドルウェアはStartup.Configureに登録され、呼び出し方法はUse* シリーズの拡張方法であり、以下は登録ミドルウェアの構文である.
    
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        app.UseMyCustomMiddleware();
    }
    

    ミドルウェアの実行順序と登録順序は一致していることに注意してください.

    Invokeメソッド


    各ミドルウェアにはInvoke()メソッドが含まれています.このメソッドパラメータはHttpContextの一例です.このミドルウェアのビジネスロジックは次のミドルウェアの実行前後で実行されます.もしあなたが少し愚かであれば、次のコード注釈に示すように、 とは何かを理解することができます.
    
    public async Task Invoke(HttpContext context)
    {
        // Write code here that will be executed before the
        // next middleware is called
            await _next.Invoke(context); // call next middleware
        // Write code here that will be executed after the
        //next middleware is called 
    }
    

    シャントHttp配管

    Map 拡張方法、例えば、MapおよびMapWhenは、pipelineパイプラインの動作を分流するためによく使用され、前者はRequest pathに基づいて分流され、後者は指定された に基づいて分流される.
    次のコードクリップは、Mapメソッドを使用してRequest Pipelineをスプリットする方法を示しています.
    
    public class Startup
    {
        private static void MapRequestA(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("This is MapRequestA");
            });
        }
        private static void MapRequestB(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("This is MapRequestB");
            });
        }
        private static void MapRequestC(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync("This is MapRequestC");
            });
        }
        public void Configure(IApplicationBuilder app)
        {
            app.Map("/mapRequestPathA", MapRequestA);
            app.Map("/mapRequestPathB", MapRequestB);
            app.Map("/mapRequestPathB", MapRequestC);
    
            app.Run(async context =>
            {
                await context.Response.WriteAsync("Hello World!");
            });
        }
       //Other methods
    }
    

    MapWhenメソッドは2つのパラメータを受け入れます.
  • Func predicate
  • delegate action
  • Startup.Configureメソッドでは、次のコードに示すように、text/xmlフォーマットのrequestを拒否できます.
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                app.MapWhen(context => context.Request.ContentType.Equals
                ("text/xml", StringComparison.InvariantCultureIgnoreCase),
                (IApplicationBuilder applicationBuilder) =>
                {
                    applicationBuilder.Run(async context =>
                    {
                        await Task.FromResult(context.Response.StatusCode = StatusCodes.Status406NotAcceptable);
                    });
                });
                app.UseMvc();
            }
    

    UseWhenの使用


    UseWhenメソッドは、現在のRequest要求パスが/apiで始まる場合、次のような指定されたミドルウェアを実行する条件付き実行ミドルウェアに使用できます.
    
    app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
    {
        applicationBuilder.UseCustomMiddleware();
    });
    

    UseWhenはMapWhenとは異なり、前者は後続のミドルウェアロジックを実行し続けます.現在のUseWhenの委任関数がtrueを返してもfalseを返しても、少し愚かであれば、次のコードを理解してください.
    
    app.UseMiddlewareA();
    app.UseWhen(context => context.Request.Path.StartsWithSegments("/api"), applicationBuilder =>
    {
        applicationBuilder.UseMiddlewareB();
    });
    app.UseMiddlewareC();
    

    中間部品が短絡していない場合、中間部品AおよびCは必ず実行され、要求経路が/apiで始まると、中間部品Bもスケジューリングされる. ASP.Net Core要求処理パイプには、すべての要求と応答がこのパイプを通過するミドルウェアチェーンがあり、新しい要求が到着すると、これらのミドルウェアは要求を処理するか、パイプ内の次のコンポーネントに要求を伝達するかのいずれかであり、より複雑な要求処理については、MapおよびMapWhenメソッドを使用してパイプを分割し、UseWhen条件付きでミドルウェアを実行することができる.
    翻訳リンク:
    https://www.infoworld.com/art...
    もっと高品質の乾物:私のGitHub:csharptranslateを参照