このように、コンポーネントは要求と応答を処理できます。ミドルウェアは、アプリケーションミドルウェアコレクションに追加された順に実行されます。
app.UseStaticFiles();
は、静的ファイル(画像、CSS、スクリプトなど)を処理するためのmiddlwareを追加します。
パイプラインで独自の処理を追加したい場合、ミドルウェアクラスを下のサンプルとして作成できます。
public class GenericMiddleware
{
public GenericMiddleware(RequestDelegate next)
{
_next = next;
}
readonly RequestDelegate _next;
public async Task Invoke(HttpContext context, IHostingEnvironment hostingEnviroment)
{
//do something
await _next.Invoke(context);
}
}
ここで興味深い点がいくつかあります。最初にコンストラクタをオフにすると、呼び出される次のミドルウェアオブジェクトは本質的に(しかし正確には)そのものではなく、RequestDelegate
になります。
次に、独自のInvoke
メソッドを実装します。このメソッドはパラメータとしてHttpContext
を取る必要があり、また、IoCコンテナから追加の依存関係を注入することもできます(私の例ではIHostingEnvironment
インスタンス)。
このメソッドは、実行する必要があるコードを実行し、RequestDelegate
を実行して次のミドルウェアクラスを呼び出すawait _next.Invoke(context);
を呼び出します。
は今、あなたは、単にstartup.cs
ファイルでのごConfigure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
方法で app.UseMiddleware<GenericMiddleware>();
を呼び出すことができるアプリケーションミドルウェアにこれを追加します。
または、次のような単純な拡張メソッドを作成します。
その後、app.UseGenericMiddleware();
今どのように、なぜあなたがあなた自身のミドルウェアを実装するのはあなた次第ですと呼ばれる
public static class GenericMiddlewareExtensions
{
public static IApplicationBuilder UseGenericMiddleware(this IApplicationBuilder app)
{
app.UseMiddleware<GenericMiddleware>();
return app;
}
}
。しかし、それがない場合は、次のRequestDelegate
を呼び出すことはミドルウェアに任されています。
これは、データベースがインストールされているかどうかを確認するプロジェクトの1つの例です。そうでなければ、要求をインストールページにリダイレクトします。 !DatabaseHelper.IsDatabaseInstalled()
は、我々は、応答をリダイレクトしますが_next
RequestDelegate
を呼び出すいけない場合、あなたが見ることができるように
public class InstallationMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger _logger;
public InstallationMiddleware(RequestDelegate next, ILoggerFactory loggerFactory)
{
_next = next;
_logger = loggerFactory.CreateLogger<InstallationMiddleware>();
}
public async Task Invoke(HttpContext context)
{
_logger.LogInformation("Handling request: " + context.Request.Path);
if (context != null && !DatabaseHelper.IsDatabaseInstalled())
{
if (!context.Request.Path.ToString().ToLowerInvariant().StartsWith("/installation"))
{
context.Response.Redirect("/installation");
return;
}
}
await _next.Invoke(context);
_logger.LogInformation("Finished handling request.");
}
}
。
ここでもまた、ドキュメントはそれ自体について語ります。
あなたは具体的に何を追加していますか、それを一般的に行う方法を知りたいですか? – Nico
@Nico私はこれについて何の考えも持っていませんが、パターンや他のパターンの組み合わせを最初に知りません。そのサンプルや簡単なサンプルに関する情報があります。 – JKL