NotFound () работает не так, как ожидалось - PullRequest
0 голосов
/ 28 мая 2020

Я новичок в ядре ASP. NET, так что я надеюсь, что вы терпите меня по этому поводу. Это похоже на этот неотвеченный вопрос .

Когда я тестирую новый проект C# MVC и ввожу неправильный URL-адрес, информации нет. Просто пустая страница.

Чтобы решить эту проблему, я адаптировал startup.cs, добавив UseStatusCodePagesWithReExecute(), чтобы возвращать stati c 404. html page. Это работает.

Пока все хорошо.

Теперь я кодирую базовый c логин c. В целях тестирования я звоню return NotFound();, когда параметры публикации отсутствуют. Это ничего не возвращает. Я знаю, что 404 - неправильный ответ, но я видел NotFound(); в сгенерированном коде и думаю, что это возвращает пустые страницы, поэтому я хочу решить эту проблему, прежде чем двигаться дальше.

1017 *, похоже, для этого не вызывается. Я не уверен, как это проверить.

Есть ли способ отменить поведение NotFound();, чтобы получить 404. html как-то?

Это Учебник Я использовал для создания своего проекта.

Редактировать: Основываясь на комментариях Александра Поволоцкого, я заменил NotFound(); на Redirect("~/404.html");. Это работает.

// Wherever you want to return your standard 404 page
return Redirect("Home/StatusCode?code=404");


public class HomeController : Controller
{
    // This method allows for other status codes as well
    public IActionResult StatusCode(int? code)
    {
        // This method is invoked by Startup.cs >>> app.UseStatusCodePagesWithReExecute("/Home/StatusCode", "?code={0}");
        if (code.HasValue)
        {
            // here is the trick
            this.HttpContext.Response.StatusCode = code.Value;
        }

        //return a static file.
        try
        {
            return File("~/" + code + ".html", "text/html");
        }
        catch (FileNotFoundException)
        {
            return Redirect("Home/StatusCode?code=404");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 30 мая 2020

Поработав еще немного над вопросом, я нашел способ сделать это без использования перенаправления, как было предложено Александром Поволоцким.

Я создал класс Utilities для возврата кода 404 и 404 . html.

В HomeController у меня есть StatusCode IActionResult.

// This method is invoked by Startup.cs >>> app.UseStatusCodePagesWithReExecute("/Home/StatusCode", "?code={0}");
public IActionResult StatusCode(int? code)
{
    // Call the static method
    return Utilities.StatusCode(code: code.Value, this.HttpContext);
}

В Models я добавил Utilities.cs.

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Http;
using System.IO;

namespace MediaMgt.Models
{
    public static class Utilities
    {
        public static IActionResult StatusCode(int code, HttpContext httpContext)
        {
            // here is the trick
            httpContext.Response.StatusCode = code;

            //return a static file.
            try
            {
                return new VirtualFileResult("~/" + code + ".html", "text/html");
            }
            catch (FileNotFoundException)
            {
                httpContext.Response.StatusCode = 404;
                return new VirtualFileResult("~/404.html", "text/html");
            }
        }
    }
}

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

Отсюда вы можете легко добавить больше функций.

1 голос
/ 29 мая 2020

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

...