DelegatingHandlerを拡張する新しいハンドラーを作成して、コントローラーに到達する前に何かを行えるようにします。 DelegatingHandlerから継承し、次のようにSendAsync()をオーバーライドする必要があるさまざまな場所を読んでいます。
public class ApiKeyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// do custom stuff here
return base.SendAsync(request, cancellationToken);
}
}
私はどこにも登録していないので何もしないことを除いて、これはすべてうまくいきます!繰り返しになりますが、WebApiConfig.csでそうする必要のある多くの場所を見てきましたが、それはASP.NETの一部ではありませんCore Web APIのバージョンです。 Startup.csファイルのさまざまなもの(Configure()、ConfigureServices()など)の中に類似物を見つけようとしましたが、運はありません。
新しいハンドラーを登録する方法を教えてください。
前のコメントですでに述べたように、 独自のミドルウェアの作成
ApiKeyHandler
は、そのコンストラクターで次のRequestDelegate
を取り込み、次に示すようにInvoke
メソッドをサポートするミドルウェアクラスに変換できます。
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace MyMiddlewareNamespace {
public class ApiKeyMiddleware {
private readonly RequestDelegate _next;
private readonly ILogger _logger;
private IApiKeyService _service;
public ApiKeyMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IApiKeyService service) {
_next = next;
_logger = loggerFactory.CreateLogger<ApiKeyMiddleware>();
_service = service
}
public async Task Invoke(HttpContext context) {
_logger.LogInformation("Handling API key for: " + context.Request.Path);
// do custom stuff here with service
await _next.Invoke(context);
_logger.LogInformation("Finished handling api key.");
}
}
}
ミドルウェアは
UseMiddleware<T>
拡張機能は、以下の例に示すように、コンストラクターにサービスを直接注入します。依存性を注入したサービスは自動的に入力され、拡張機能は、注入されていないパラメーターに使用される引数のparams
配列を受け取ります。
ApiKeyExtensions.cs
public static class ApiKeyExtensions {
public static IApplicationBuilder UseApiKey(this IApplicationBuilder builder) {
return builder.UseMiddleware<ApiKeyMiddleware>();
}
}
拡張メソッドと関連するミドルウェアクラスを使用して、Configureメソッドは非常にシンプルで読みやすくなります。
public void Configure(IApplicationBuilder app) {
//...other configuration
app.UseApiKey();
//...other configuration
}