Как вернуть 404 на неверный URL API? (ASP.NET Core + SPA) - PullRequest
0 голосов
/ 17 сентября 2018

Мне нужно вернуть 404 при неправильном вызове API, чтобы я мог создать правильный ответ пользователю на стороне клиента (Angular 5).В настоящее время backend возвращает код состояния 200 и index.html, что приводит к ошибке синтаксического анализа json во внешнем интерфейсе.

Я создал новый веб-проект с ASP.NET Core 2.1 и шаблоном Angular.Вот ссылка на опубликованную версию этого шаблона.Я вообще не менял код шаблона, я просто опубликовал его на Azure как есть.(В режиме разработки я получаю ошибку 404, как и ожидалось).

Как уже упоминалось здесь поведение по умолчанию должно быть 404.

Здесь - это Startup.cs, а здесь SampleDataController.cs.

Я думал об использовании чего-то подобного в Startup.cs:

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller}/{action}/{id?}");
        });

        app.MapWhen(x => x.Request.Path.Value.Contains("/api"), builder =>
        {
            builder.UseMvc(routes =>
            {
                routes.MapSpaFallbackRoute(
                    name: "spa-fallback",
                    defaults: new { controller = "Home", action = "Error" });
            });
        });

И в HomeController.cs:

    public IActionResult Error()
    {
        return NotFound();
    }

Но это кажется неправильным, хотя этоработает.

1 Ответ

0 голосов
/ 14 августа 2019

Примечание: Исходя из ваших ссылок, я предполагаю, что вы используете промежуточное программное обеспечение app.UseSpa().

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

То, что вы захотите сделать, вызывайте UseSpa(), только если у маршрута нет префикса /api. По сути, любые запросы, начинающиеся с /api, пропускаются после этой точки.

Вместо:

app.UseSpa(spa =>
{
    //[Snip]
});

Использование:

app.MapWhen(x => !x.Request.Path.Value.StartsWith("/api"), builder =>
{
    builder.UseSpa(spa =>
    {
        //[Snip]
    });
});

Это разрешит любой запрос, который начинается с /api после этой точки, и, если никакое другое промежуточное ПО или маршруты не совпадают, будет возвращено 404.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...