オセロットカスタムパイプラインミドルウェア

オセロットが有効であり、あなたがソースコードはそのコアが1つのパイプラインのミドルウェアコンポーネントで構成されていることがわかります読んでいる場合ではない、カザフスタン、我々はすべて知っているゲートウェイを導入し、もちろん、これはまた、ハイライトのネットコアの一つです。リクエストが来た、それは注文処理ミドルウェアに基づいて登録され、今日の問題は、ここではミドルウェア・オセロットパイプラインにあり、現在はゲートウェイレベルでのデータの暗号化と復号化を望んでいるの需要があり、フロントエンドは、ゲートウェイを介してデータを暗号化しますダウンストリーム送信復号化の際、下りデータは、フロントエンドゲートウェイが暗号化されているに戻されます。

ここでは、2つの中間レジスタは、そのパイプオセロット要求とデータ処理結果を周りに行きたかったです。その後、Enterキーを押してやってみたかったが、オセロットが直接呼び出し元にデータを返すと、その背後にミドルウェアパイプラインを行っていない、我々はパイプラインの後に再び呼び出されていない次のオセロットの真ん中を知る前に、情報を確認対処、という悲しいリマインダー作品、そしてこの卵の痛み、どのように?

オセロットは突然、ユーザーがそれは、当然の答えはイエス、この記事では、我々はオセロットのミドルウェアでパイプラインをカスタマイズしますされるカスタムパイプラインのミドルウェアを提供できるように拡張されなければならないと思いました。

まず、あなたがOcelotMiddlewareを継承する必要があり、独自のミドルウェアを記述する必要があります。

パブリック クラスTestResponseMiddleware:OcelotMiddleware 
    { 
        プライベート 読み取り専用OcelotRequestDelegate _next。
        公共TestResponseMiddleware(OcelotRequestDelegate次、IOcelotLoggerFactory loggerFactory) ベース(loggerFactory.CreateLogger <TestResponseMiddleware> ())
        { 
            _next = 次回。
        } 


        パブリック 非同期タスク起動(DownstreamContextコンテキスト)
        { 
            場合(!context.IsError && context.HttpContext.Request.Method.ToUpper()!= " OPTIONS " 
            {
                // 对返回结果进行加密
                 // Logger.LogInformation( ""); 
                もし(!context.HttpContext.Response = NULL && context.DownstreamResponse.Content.Headers.ContentLength> 0 
                { 
                    VARの結果は= 待つ)(context.DownstreamResponse.Content.ReadAsStringAsyncします。
                    使用VAR MD5 = MD5.Create())
                    { 
                        VAR md5Result = md5.ComputeHash(Encoding.ASCII.GetBytes(結果))。
                        VAR strResult = BitConverter.ToString(md5Result)。 
                        strResult = strResult.Replace(" - """ ); 
                        context.HttpContext.Response.Body.Write(Encoding.UTF8.GetBytes(strResult))。
                    } 
                } 
            } 
            
            { 
                待つ_next.Invoke(コンテキスト)。
            } 
        } 
    }

このロジックは、MD5暗号化されたデータの結果を得るために要求した後、その後返し、です。

その後、我々は新しいクラスの登録、メソッドのミドルウェアを作成するために設計された登録ダクトを作成します。

    パブリック 静的 クラスTestServiceExtension 
    { 
        パブリック 静的 IOcelotPipelineBuilder UseTestResponseMiddleware(このIOcelotPipelineBuilderビルダー)
        { 
            戻り builder.UseMiddlewareを<TestResponseMiddleware> (); 
        } 
    }

そして、焦点はあります!使用するソースコードを変更して、我々はソースコードを見て、登録パイプラインミドルウェア場所を見つける必要があり、その後、ファイル来るが、あなたのプロジェクト参照にそれを置くことをコピーオセロットは、あなたが理解することができます。私たちの最初の外観は、ここで、OcelotMiddlewareExtensions.csファイルであるコールエントリオセロットパイプラインミドルウェアはあなたにUseOcelot拡張メソッドを信じていない、次のとおりです。

パブリック 静的 クラスOcelotMiddlewareExtensions 
    { 
        パブリック 静的 非同期タスク<IApplicationBuilder> UseOcelot(このIApplicationBuilderビルダー)
        { 
            待つ builder.UseOcelotを(新しいOcelotPipelineConfiguration())。
            リターン・ビルダー。
        }

私たちはこれを見て別の方法は、内部CreateOcelotPipelineで、オセロットパイプライン:

        プライベート 静的IApplicationBuilder CreateOcelotPipeline(IApplicationBuilderビルダー、OcelotPipelineConfiguration pipelineConfiguration)
        { 
            VARの pipelineBuilder = 新しいOcelotPipelineBuilder(builder.ApplicationServices)。

            pipelineBuilder.BuildOcelotPipeline(pipelineConfiguration)。

            VAR firstDelegate = pipelineBuilder.Build()。

            / * 
            これを好きではないのasp.net middleware..maybeの最初の部分に最初のデリゲートを注入
            我々はオセロットにHTTPコンテキストを更新しているので、それがために正しい出てくる、その後
            asp.netの残り.. 
            * / 

            builder.Properties [ "analysis.NextMiddlewareName " ] = " TransitionToOcelotMiddleware " ; 

            builder.Use(非同期(コンテキスト、タスク)=> 
            { 
                VARの downstreamContext = 新しいDownstreamContext(コンテキスト);
                 待つfirstDelegate.Invoke(downstreamContextを); 
            }); 

            戻りビルダー; 
        }

オセロットパイプラインのミドルウェアを作成する方法であり、このコードのpipelineBuilder.BuildOcelotPipeline(pipelineConfiguration)の内部を見ることができ、我々はに見て、これらの二つの場所つまり、この方法OcelotPipelineExtensions.csクラスファイル、ポイントを変更したいです:

 パブリック 静的 クラスOcelotPipelineExtensions 
    { 
        公共の 静的 OcelotRequestDelegate BuildCustomeOcelotPipelineは(このIOcelotPipelineBuilderビルダー、
            OcelotPipelineConfiguration pipelineConfiguration)
        { 
            // これが処理されない任意のグローバル例外をキャッチするように登録されている
             // 何がグローバルに設定されている場合、それはまた、リクエストIDを設定
            builder.UseExceptionHandlerMiddlewareを() ; 

            // リクエストがWebSocketをためている場合は、我々は別のパイプラインにフォークアップグレード 
            builder.MapWhen(コンテキスト=> context.HttpContext.WebSockets.IsWebSocketRequest、
                アプリ =>
                { 
                    app.UseDownstreamRouteFinderMiddleware()。
                    app.UseDownstreamRequestInitialiser(); 
                    app.UseLoadBalancingMiddleware(); 
                    app.UseDownstreamUrlCreatorMiddleware(); 
                    app.UseWebSocketsProxyMiddleware(); 
                }); 

            // ユーザーは、彼らが望む絶対に何もで応答することを許可します。
            builder.UseIfNotNull(pipelineConfiguration.PreErrorResponderMiddleware)。

            // それはすべてのエラーをキャッチし、適切な応答を発行することができますので、これは最初に登録されている
            builder.UseResponderMiddlewareを(); 

            //その後、我々は下流の経路情報を取得します
            )(builder.UseDownstreamRouteFinderMiddlewareを。

            // このセキュリティモジュール、IPホワイトリスト、ブラックリスト、拡張セキュリティメカニズム
            builder.UseSecurityMiddleware(); 

            // 他の分岐管を展開し
            た場合(!pipelineConfiguration.MapWhenOcelotPipeline = ヌル
            { 
                foreachのVARのパイプラインpipelineConfiguration.MapWhenOcelotPipeline)
                { 
                    builder.MapWhen(パイプライン)。
                } 
            } 

            // 今、我々は、ヘッダーやものを変換することができ、DSのルートを持っていますか?
            builder.UseHttpHeadersTransformationMiddleware(); 

            // 初期化し、下流要求
            builder.UseDownstreamRequestInitialiser()。

            // 私たちは、要求がレート制限であるかどうかをチェックして、ノーがある場合は、処理を続行
            builder.UseRateLimitingを(); 

            // これは、追加または(我々がしようとするとエラー処理ミドルウェアのグローバル設定に基づいてこれを設定initally)要求IDを更新
             // 何がグローバルレベルで設定された場合は、グローバルなものはなります我々は再ルートレベルで異なる設定を持っています上書き
             // これはリクエストIDミドルウェアにミドルウェアの最初の部分から別の要求IDを持っているシナリオを入手できることを意味します。
            builder.UseRequestIdMiddleware(); 

            // 事前認証ロジックを許可します。。アイデアという人は、カスタムで構築されたものを前に、何かを実行することをお勧めします
            builder.UseIfNotNull(pipelineConfiguration.PreAuthenticationMiddleware)。

            // 今、私たちは、クライアントが行くつもりされた場合、我々はそれらを認証することができます知っています。
            // 私たちはオセロットミドルウェアは、どんなことで上書きすることを可能にする
             // ユーザーが望んでいる
            場合(pipelineConfiguration.AuthenticationMiddleware == nullの
            { 
                builder.UseAuthenticationMiddleware(); 
            } 
            
            {
                builder.Use(pipelineConfiguration.AuthenticationMiddleware)。
            } 

            // 我々はクレームを見ているん次のことは、これは、認可のために重要である場合には変換
            )(builder.UseClaimsToClaimsMiddleware。

            // 事前承認ロジックを許可します。。アイデアという人は、カスタムで構築されたものを前に、何かを実行することをお勧めします
            builder.UseIfNotNull(pipelineConfiguration.PreAuthorisationMiddleware)。

            // 今、我々はクレーム変換認証され、行っている
             // リクエスト承認することができます
             // 我々はオセロットミドルウェアは、どんなことで上書きすることを可能にする
             // ユーザーが望んでいるの
            もし(pipelineConfiguration.AuthorisationMiddleware == NULL 
            { 
                builder.UseAuthorisationMiddleware()。
            } 
            
            { 
                builder.Use(pipelineConfiguration.AuthorisationMiddleware)。
            } 

            // 今、私たちは、ヘッダ変換ミドルウェアへの請求を実行することができます
            builder.UseClaimsToHeadersMiddleware(); 

            // ユーザーが自分のクエリ文字列操作ロジックを実装することを許可する
            builder.UseIfNotNull(pipelineConfiguration.PreQueryStringBuilderMiddlewareを)。

            // 今、私たちは、クエリ文字列変換ミドルウェアにクレームを実行することができます
            builder.UseClaimsToQueryStringMiddleware(); 

            // この要求のロードバランサを取得
            builder.UseLoadBalancingMiddlewareを(); 

            // これは、我々が以前に取得した下流ルートを取り、使用しなければならない変数を任意のプレースホルダを置き換え
            builder.UseDownstreamUrlCreatorMiddleware(); 

            // これは、このために最高の場所ですが、我々は、下流のURLを使用するかどうかわからない
             // 私たちのキャッシュキーのための基礎として。
            builder.UseOutputCacheMiddleware(); 

            // 私たちは要求をオフに解雇し、スコープのデータレポに応答を設定
            )(builder.UseHttpRequesterMiddleware。

            //添加自定义测试中间件
         builder.UseTestResponseMiddleware(); 

            返すbuilder.Buildを(); 
        } 

        プライベート 静的 ボイド UseIfNotNull(このIOcelotPipelineBuilderビルダー、
            のFunc <DownstreamContext、のFunc <タスク>タスク> ミドルウェア)
        { 
            場合(ミドルウェア!= NULL 
            { 
                builder.Use(ミドルウェア)。
            } 
        } 
    }

我々はミドルウェアと呼んでいるものだけでなく、実際には1つのコール拡張メソッドをそれを見ることができ、私は最終的にそれがそこに赤でマークされ、ミドルウェアまで追加書き、そして今、すべての要求がオセロットに上に行くだろうオハイオ州で独自のプロジェクトでOcelotPipelineExtensions.csクラスファイルを修正するために必要な時間を利用して、当社のミドルウェアの契約。

 

私たちは完了です。

おすすめ

転載: www.cnblogs.com/weiBlog/p/11241535.html