Ответ 1
Как уже упоминалось в предыдущем комментарии, посмотрите на " Написание собственного промежуточного программного обеспечения"
Ваш 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
}