I.概要
この記事を共有するEndpoint
ルーティングエンドポイント中间件
ではない、それがどのように機能するかについては、シナリオと実践例を学生が作品を理解する必要がある場合、
あなたは記事の以下の解釈の2を参照してくださいするにはここをクリックすることができます:
ミドルウェア(ミドルウェア)の1.1役割の
私たちは、ウェブフレームのいずれかがHTTP要求パイプラインにカプセル化されていることを知って、要求は一連の操作パイプラインを通じてあるたびに、私たちは、最終的なコードを記述します。次いで、ミドルウェア・アプリケーションは、処理中の要求および他のいくつかの応答をインターセプトするためのパイプラインの構成要素です。ミドルウェアは、多くのことができ、各ブローカは、それが次のミドルウェアへの転送を要求するかどうかを決定することができ、パイプライン要求に傍受することができます。
asp.netコアが提供IApplicationBuilder
asp.netパイプラインにミドルウェア登録要求を移動していた可能インターフェースを、ミドルウェアが典型的であるAOP
アプリケーション。以下は、Microsoftの公式ミドルウェア・パイプライン要求のマップです。
1.2とフィルタミドルウェアの違い
Filter
ASP.NET MVCは、許可フィルター、リソースフィルター、アクションフィルタはそれぞれ、フィルターの5を保持し、製品の継続である 、例外フィルタと結果フィルター。
詳細については、私の最後の共有参照してください簡単な言葉でそれらのものをAsp.Netコアフィルターを-AOP記事を。
説明によると、それは同様のミドルウェアやフィルタ機能を見ることができ、その後、その違いは何ですか?なぜ彼らはミドルウェアに従事していますか?
実際には、フィルタとの懸念が同じではないミドルウェア、それは同じ義務ではない、物事をすることは同じではありません。
2と同じAOP
武器Filter
アプリケーション自体に焦点を当てて(フィルタ)よりフィッティングビジネス、そのようなあなたが見るようにActionFilter
し、ResultFilter
それを直接、あなたはAction
、ActionResult
相互作用が、私はいくつかを持っていることをあなたに近い感じではありません例えば、私の出力はの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()
ミドルウェア後。
第三に、公式の共通ミドルウェア
- 例外/エラー処理
:ときにアプリケーションが開発環境で実行されている場合
(開発者の異常ページミドルウェアUseDeveloperExceptionPage
アプリケーション実行時エラーを報告します)。
データベースミドルウェアランタイムを報告するエラーデータベース・エラー・ページ。
アプリケーションは、本番環境で実行されている場合:
例外ハンドラミドルウェア(UseExceptionHandler
)キャプチャ異常は、ミドルウェアによって引き起こされます。
HTTP厳格なトランスポート・セキュリティ・プロトコル(HSTS)ミドルウェア(UseHsts)を加え厳密・トランスポート・セキュリティ・ヘッダ。 - HTTPSリダイレクトミドルウェア(
UseHttpsRedirection
HTTPS)にリダイレクトHTTPリクエスト。 - 中間静的ファイル(
UseStaticFiles
)静的ファイルを返し、さらに要求の処理を簡略化します。 - クッキーポリシーミドルウェア(
UseCookiePolicy
)EU一般データ保護規則(GDPR)の規定に準拠アプリケーション。 - (ミドルウェアをルーティングするための要求をルーティング
UseRouting
)。 - 認証ミドルウェア(
UseAuthentication
)セキュアなリソースへのユーザーアクセスを許可する前にユーザーを認証するための試み。 - アクセス安全なリソースへの許可されたユーザのためのミドルウェアを許可(
UseAuthorization
)。 - セッションミドルウェア(
UseSession
セッション状態を確立し、維持するために)。アプリケーションは、クッキーポリシーミドルウェア後にセッションミドルウェアを呼び出す前に、セッションの状態、およびミドルウェアMVCを使用している場合。 - 以下のための手段
Razor Pages
(MapRazorPagesと中間パイプをルーティングするエンドポイントを要求するエンドポイントに追加しますUseEndpoints
)。
あなたが良いを感じた場合は、マイクロチャンネルスキャンコードに焦点を当ててください[パブリック]博士DOTNET番号は、フォローアップは、共有へのあなたがよりエキサイティング持参します
間違った場所よりも多く存在する場合は、正しい正を喜ばご支援ありがとうございました!!