Перенаправить на культуру по умолчанию, если культура не указана в URL

Я пытаюсь сделать что-то вроде того, что Microsoft использует для сайта документации. например, когда я ввожу приведенную ниже ссылку в адресной строке, сайт Microsoft Office Docs перенаправляет меня на стандартную ссылку, как во второй ссылке.

Первая ссылка: https://docs.microsoft.com/aspnet/core/fundamentals/localization?view=aspnetcore-2.2 Вторая ссылка: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2

Я иду шаг за шагом с https://joonasw.net/view/aspnet-core-localization-deep-dive, и проект успешно запускается, и я могу изменить культуру, вызывая URL-адреса как

localhost:5001/tr-TR/home/index ({culture}/[controller]/[action]) 

но когда я пытаюсь направить

localhost:5001/home/index (without culture route value)

Я получаю ошибку 404.

Что мне нужно, это направить вышеуказанную ссылку в какое-то действие общего контроллера, а затем перенаправить его на

localhost:5001/{defaultculture}/home/index

Заранее спасибо.

2 ответа

За https://docs.microsoft.com, он использовал функцию перенаправления URL для реализации маршрута https://docs.microsoft.com/aspnet/core/fundamentals/localization?view=aspnetcore-2.2 в https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2, Если вы проверите журнал запросов для https://docs.microsoft.com/aspnet, вы найдете для первого запроса, он возвращает ответ с Status Code: 301 а затем вернуться https://docs.microsoft.com/en-us/aspnet,

По вашему требованию, если вам нужно только localhost:5001/home/index вернуть вид из localhost:5001/en-us/home/index без изменения URL на localhost:5001/en-us/home/index, Вы могли бы попробовать

var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
var requestProvider = new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0, requestProvider);
app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en-US}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
        });
    });

});

Если вам нужен URL такой же, как localhost:5001/en-us/home/indexВы также должны предпринять действие перенаправления.

app.Use(async (context, next) =>
{
    await next.Invoke();
    if (context.Response.StatusCode == StatusCodes.Status404NotFound)
    {
        context.Response.Redirect(@"/en-us/Home/Index", true);
    }
});

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture}/{controller=Home}/{action=Index}/{id?}");
        });
    });

});

Вам нужно изменить свой маршрут. В приведенном ниже примере, когда пользователь вводит localhost:5001/home/index будет перенаправлен на RedirectToCulture действие в Home контроллер. Теперь вы можете читать параметры (или нет) и перенаправлять с культурой глухих

routes.MapRoute(
    name: "default1",
    template: "{culture:required}/{controller:required}/{action:required}/{id?}",
    defaults: new { culture = "en-US", controller = "Home", action = "Index" });

routes.MapRoute(
    name: "default2",
    template: "{stringController?}/{stringAction?}/{id?}",
    defaults: new { controller = "Home", action = "RedirectToCulture" });