2 votes

Est-il possible de renvoyer une erreur 404 à partir du middleware ASP.NET Core 6 MVC

J'ai une application ASP.NET Core 6 MVC avec à la fois des contrôleurs basés sur des vues et des contrôleurs API. J'aimerais pouvoir désactiver certains contrôleurs via la configuration, et j'ai un middleware qui fonctionne :

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
        context.Request.RouteValues.TryGetValue("controller", out var controller);

        if (controller != null)
        {
            if (!_allowControllers.IsMatch(controller as string))
                context.Abort();
            else if (_denyControllers.IsMatch(controller as string))
                context.Abort();
        }

        await next(context);
}

Cependant, lorsque déclenché, le client obtient une connexion interrompue. Est-il possible de retourner un "404" à la place? J'ai essayé

context.Response.Redirect("/notfound");

au lieu de Abort, mais cela ne semble pas fonctionner pour les contrôleurs API.

1voto

Guru Stron Points 1734

Vous voulez un middleware de court-circuit/terminal, c'est-à-dire un middleware qui n'appelle pas (ou n'appelle pas toujours) next. Quelque chose comme ce qui suit:

public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
    context.Request.RouteValues.TryGetValue("controller", out var controller);

    if (controller is string str 
        && (!_allowControllers.IsMatch(str) || _denyControllers.IsMatch(str)))
    {
        context.Response.StatusCode = (int)HttpStatusCode.NotFound;
    }
    else
    {
        await next(context);    
    }
}

En savoir plus:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X