ASP.NET Core アプリケーションを作成する場合、パイプラインは、設定済みのミドルウェアコンポーネントを一緒に接続して構築されます。

デフォルトでは(たとえば、標準テンプレート アプリケーションのスタートアップコードを再利用する場合)、このパイプラインでパイプラインまたはミドルウェアコンポーネントのシーケンスを構築する方法を定義する必要はありません。すべてが定義したとおりに動作します。より複雑な処理が要求されるアプリケーションでは、通常、ミドルウェアパイプラインを変更し、.NET エージェントが ASP.NET Core アプリケーションをインストゥルメント化する方法について検討します。Microsoft のサイトで、ミドルウェアパイプラインの情報を参照してください。

.NET エージェントは、パイプラインのさまざまなポイントでこのミドルウェアパイプラインをインストゥルメント化できます。各インストゥルメンテーション オプションには、次の利点と欠点があります。

  • Resource Invoker インストゥルメンテーション
  • エンドポイント インストゥルメンテーション
  • HTTP インストゥルメンテーション
  • MVC ルーティング インストゥルメンテーション

Resource Invoker インストゥルメンテーション

  • ASP.NET Core 2.x のデフォルト設定。
  • ASP.NET Core 3.x および 5.0 の場合、ノードプロパティ aspdotnet-core-instrumentation (string) = "ResourceInvoker" を有効に設定します。

このインストゥルメンテーションは、コントローラアクションまたはページハンドラを呼び出す直前の、パイプラインの最後に発生します。これは、Razor Page ハンドラ、および MVC と Web API コントローラのアクションに適用されます。

利点は、実際のアクションコードのみがインストゥルメント化されることです。また、.NET エージェントのインストゥルメンテーションは、静的ファイルやパスが見つからないなどの他の Web 要求に対しては実行されません(Error Code 404)。

これは最も軽いインストゥルメンテーション オプションです。ほとんどの ASP.NET Core アプリケーションに最適な選択肢となります。特に、デフォルトのアプリケーションコードからミドルウェアパイプラインに最小限のカスタマイズが適用されるか、カスタマイズが適用されない場合に最適です。

エンドポイント インストゥルメンテーション

  • ASP.NET Core 3.x および 5.0 のデフォルト設定(.NET エージェント 21.3)。
  • ASP.NET Core 2.x では使用できません。

ASP.NET Core 2.2 で導入されたエンドポイントルーティングが改善され、Web API、MVC、および Razor ページのすべてのルーティングが新しいアーキテクチャにマージされました。これにより、.NET エージェントで EndpointRoutingMiddleware の直後にインストゥルメンテーションを実行できるようになります。

Resource Invoker インストゥルメンテーションの代わりにエンドポイント インストゥルメンテーションを使用する利点は、ビジネストランザクションが EndpointRoutingMiddleware の後のすべてのミドルウェアの実行を通じて追跡されることです。これにより、コントローラのアクションが実行される前に実行された操作の可視性が向上します。これには、認証や認可などのルーティングプロセスに関与するミドルウェアだけが含まれますが、正常性の確認や静的ファイルの提供などのミドルウェアは含まれません。

エンドポイント インストゥルメンテーションは、パイプラインの完全な可視性(過剰なノイズとオーバーヘッドを引き起こす可能性がある)と、可視性のない状態(Resource Invoker インストゥルメンテーションを使用)とのバランスをとります。

HTTP インストゥルメンテーション

  • この設定は、ASP.NET Core 2.x、3.x、および 5.0(.NET エージェント 21.3)で使用できます。 
  • ノードプロパティ aspdotnet-core-instrumentation (string) = "HTTP" を設定し、有効にします。 

このインストゥルメンテーション オプションは、すべての Web 要求をインストゥルメント化して、完全なミドルウェアパイプラインをインストゥルメント化します。すべてのオプションの可視性が最も高くなります。ただし、このオプションを有効にする場合は、次の点を考慮する必要があります。

  • リクエスト URL がルーティングミドルウェアによって復号されていないため、MVC の命名はできません。MVC リクエストではない可能性があります。MVC リクエストの場合、コントローラ名とアクション名は解決されていません。すべてのビジネストランザクションで、名前に URL パスを使用します。
  • .NET エージェント インストゥルメンテーションは、すべての Web 要求(404 Errors の結果が発生する要求なども含む)を実行して検査するため、アプリケーションのパフォーマンスに大きな影響を与えます。パフォーマンスへの影響について理解するには、階層またはアプリケーション全体に対してこのオプションを有効にする前に、実稼働前環境または限られたノード数でこのオプションをテストする必要があります。 

MVC ルーティング インストゥルメンテーション

  • これは、ASP.NET Core 1.x で導入された元のインストゥルメンテーション オプションです。これは、ASP.NET Core 1.x のデフォルト設定であり、2.x で設定可能なオプションです。
  • ASP.NET Core 2.x でこれを有効にするには、ノードプロパティ aspdotnet-core-instrumentation (string) = "Legacy" を設定します。

MVC ルーティング インストゥルメンテーション機能は、ASP.NET Core 3.0 で廃止されました。パイプラインの最初のミドルウェアからインストゥルメントすることで、完全なパイプラインの可視性を提供します。ただし、着信 Web 要求の MVC の命名を実行しようとすると、問題が発生する可能性があります。これは、特定の方法でミドルウェアパイプラインを構築し、非常に具体的なミドルウェア要求の委任が含まれていることを前提としています。

ASP.NET Core 2.x を使用し、MVC の命名で完全なパイプラインの可視性が必要な場合は、これが唯一の使用可能なオプションです。