Both middleware and filter in asp.net core are used for handling incoming requests. Middleware is used for the entire request pipeline but filters are used for a specific requests. One of the biggest differences is that middleware has access to the HttpContext while filter has access to MVC (or API) context. Look are the following simple Middleware:
public class CustomMiddleware { private readonly RequestDelegate _next; private readonly ILogger<CustomMiddleware> _logger; public CustomMiddleware(RequestDelegate next, ILogger<CustomMiddleware> logger) { _next = next ?? throw new ArgumentNullException(nameof(next)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task Invoke(HttpContext httpContext) { await _next(httpContext); } }
usage of this middleware in program.cs is like the following:
var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages(); var app = builder.Build(); app.Services.GetService<ICustomService>(); if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseMiddleware<CustomMiddleware>(); app.MapRazorPages(); app.Run();
Now bout a custom filter:
public class CustomActionFilter : IActionFilter { private readonly ILogger<CustomActionFilter> _logger; public CustomActionFilter(ILogger<CustomActionFilter> logger) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public void OnActionExecuted(ActionExecutedContext context) { _logger.LogInformation($"From OnActionExecuted method of {nameof(CustomActionFilter)}"); } public void OnActionExecuting(ActionExecutingContext context) { _logger.LogInformation($"From OnActionExecuting method of {nameof(CustomActionFilter)}"); } }
And the usage of it in a controller:
[ApiController] [Route("[controller]")] [TypeFilter(typeof(CustomActionFilter))] public class WeatherForecastController : ControllerBase { }
The execution of middleware occurs before the Filters in the whole system, so it seems using middleware takes more attention.