web-dev-qa-db-ja.com

ASP.NET Core Web APIでの新しいDelegatingHandlerの登録

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()など)の中に類似物を見つけようとしましたが、運はありません。

新しいハンドラーを登録する方法を教えてください。

23
Ben

前のコメントですでに述べたように、 独自のミドルウェアの作成

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
}
21
Nkosi