Почему ASP.NET Core возвращает 404 в конце конвейера промежуточного программного обеспечения?

Я хотел узнать, как ASP.NET Core определяет, что мы достигли конца конвейера промежуточного программного обеспечения, и начинает отправлять ответ. Это код, который его обрабатывает (из репозитория GitHub):

public RequestDelegate Build()
{
    RequestDelegate app = context =>
    {
        /*
        Some code omitted for clarity
        */
        context.Response.StatusCode = 404;
        return Task.CompletedTask;
    };

    foreach (var component in _components.Reverse())
    {
        app = component(app);
    }

    return app;
}

У меня такой вопрос: что делает линия context.Response.StatusCode = 404;делать? Почему это вообще есть? Разве это не должно быть200("ОК")? Где находится код, который изменяет это значение по умолчанию, чтобы мы не получали ошибку "404 Not Found" при каждом запросе?

1 ответ

Решение

Что означает линия context.Response.StatusCode = 404;делать? Почему это вообще есть?

В конечном итоге этот вызов выполняется как последний компонент в конвейере промежуточного программного обеспечения. Если входящий запрос дойдет до конца настроенного вами конвейера, этот код будет запущен. Он нужен для того, чтобы гарантировать, что 404 будет возвращено, когда запрос не обрабатывается вашим приложением.

Разве это не должно быть 200 ("В ПОРЯДКЕ")?

Нет, ответ HTTP 200 OK для этого не подходит. Это указывает на то, что запрос был обработан успешно, но на самом деле он не был обработан вообще, потому что логика для обработки этого конкретного запроса не была найдена (HTTP 404 NotFound).

Где находится код, который изменяет это значение по умолчанию, чтобы мы не получали ошибку "404 Not Found" при каждом запросе?

Конвейер промежуточного программного обеспечения поддерживает концепцию короткого замыкания (см. Документацию). Вкратце, это означает, что компонент промежуточного программного обеспечения решает, выполнять ли следующий компонент промежуточного программного обеспечения в конвейере. Представьте себе следующую упрощенную настройку конвейера:

app.UseStaticFiles();

app.UseRouting();
app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

В этом конвейере и статические файлы, и промежуточное ПО конечных точек могут закоротить конвейер. Если промежуточное программное обеспечение статических файлов может обработать запрос, оно обычно устанавливает код состояния на HTTP 200 и возвращает файл. Если промежуточное ПО конечных точек находит соответствующий контроллер / действие, оно может делать одно из многих, но обычно оно устанавливает код состояния успеха, такой как HTTP 200.

Только если ни ПО промежуточного слоя статических файлов, ни ПО промежуточного слоя конечных точек не справляется с обработкой запроса, вызывается строка (context.Response.StatusCode = 404;) будет работать как своего рода запасной вариант.

Другие вопросы по тегам