Я пытаюсь реализовать промежуточное ПО ASP.NET Core, и это весь код, который у меня есть в моем проекте:
public class HostMiddleware : IMiddleware
{
public int Count { get; set; }
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
if (context.Request.Query.ContainsKey("hello"))
{
await context.Response.WriteAsync($"Hello World: {++Count}");
}
else
{
await next.Invoke(context);
}
}
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMiddleware<HostMiddleware>();
app.Run(async context =>
{
context.Response.StatusCode = 400;
await context.Response.WriteAsync("Bad request.");
});
}
Однако, когда я запускаю этот сервер, я получаю следующую ошибку:
InvalidOperationException: служба для типа «WebApplication4.HostMiddleware» не зарегистрирована.
Почему я получаю эту ошибку? Зачем моему промежуточному программному обеспечению нужно регистрировать какие-либо службы, если я не использую внедрение зависимостей в своем проекте?
Обновление:
По какой-то причине эта ошибка не возникает, когда я прекращаю использовать IMiddleware
, переименовываю InvokeAsync
в Invoke
и реализую свое промежуточное ПО следующим образом:
public class WmsHostMiddleware
{
private readonly RequestDelegate _next;
public int Count { get; set; }
public WmsHostMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Query.ContainsKey("hello"))
{
await context.Response.WriteAsync($"Hello World: {++Count}");
}
else
{
await _next.Invoke(context);
}
}
}
Остается открытым вопрос - почему это происходит? В чем разница? Зачем мне регистрировать услуги, когда я использую IMiddleware
.