Как я могу вернуть код состояния 404 с помощью app.UseStatusCodePages? - PullRequest
0 голосов
/ 08 мая 2020

Сейчас я обрабатываю 404 Not Found by Asp. Net Core.

Как мы знаем, есть несколько способов добиться этого: app.UseStatusCodePagesWithRedirects / app.UseStatusCodePagesWithReExecute / app.UseStatusCodePages .

Мне нужно выбрать app.UseStatusCodePages, поскольку мне нужно локализовать страницу по URL-адресу.

Например:

https://www.microsoft.com/en-us/microsoft-365/

'en-us' в URL-адресе только для выбора языка страницы.

Вот мой код в startup.cs

app.UseStatusCodePages(async context =>
            {
                string currentCulture = "";
                if (context.HttpContext.Request.Path.Value.Split('/').Length < 2)
                {
                    currentCulture = "en";
                }
                else
                {
                    string LanguageGet = context.HttpContext.Request.Path.Value.Split('/')[1];
                    currentCulture = SupportedCultures.Find(X => X.Name == LanguageGet) == null ? "en" : SupportedCultures.Find(X => X.Name == LanguageGet).Name;
                }
                var redirectPath = "/" + currentCulture + "/Error/" + context.HttpContext.Response.StatusCode;
                context.HttpContext.Response.Redirect(redirectPath);
            });

Теперь он работает.

Однако после ввода URL-адреса (localhost: 4387 / en / 123. html), которого не существует. В заголовке отображается код состояния 302 в сети Chrome DevTools, но не код состояния 404.

enter image description here

Ну, когда я ввожу URL (https://www.microsoft.com/en-us/123.html), которого не существует, заголовок показывает правильный код состояния 404 в сети Chrome DevTools. Это как раз тот код статуса, который мне нужен.

enter image description here

Я искал об этом в Google. Кто-то сказал, что я должен добавить в контроллер ProducesResponseType, вот так:

public class OthersController : Controller
    {
        [Route("{culture=en}/Error/{code:int}")]
        [ProducesResponseType(StatusCodes.Status404NotFound)]
        public IActionResult Error(int code)
        {            
            return View(code);
        }
    }

Ну, это не работает. Я хочу решить эту проблему из-за SEO.

Вот все исходные коды этого примера проекта в onedrive: https://1drv.ms/u/s! AtcqjirAlaGYiuUyWqy8gzpgPF9U1Q? E = 8WTYln

Как я могу решить это? Спасибо.

1 Ответ

0 голосов
/ 22 июля 2020

Я нашел способ, заменив код следующим образом:

app.UseStatusCodePages(async context =>
        {
            var StringArray = context.HttpContext.Request.Path.Value.Split("/");
            string currentCulture = "en";
            if (StringArray.Count() >= 2)
            {
                currentCulture = StringArray[1];
            }
            var newPath = "/" + currentCulture + "/Error/" + context.HttpContext.Response.StatusCode;
            context.HttpContext.Request.Path = newPath;                
            await context.Next(context.HttpContext);
        });
...