Я пытаюсь сопоставить области, которые я создал, с субдоменами, и мне это не удается.
У меня есть область под названием «сахар», и я использую класс SubDomainRouteTransformer
, который я нашел в Интернете, который работал для проекта ASP.NET core 5 с кодом:
public class SubDomainRouteTransformer : DynamicRouteValueTransformer
{
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
var subDomain = httpContext.Request.Host.Host.Split(".").First();
if (string.IsNullOrEmpty(subDomain))
{
values["controller"] = subDomain;
}
return values;
}
}
в моем файле program.cs я реализую это таким образом
builder.Services.TryAddTransient<SubDomainRouteTransformer>();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapDynamicControllerRoute<SubDomainRouteTransformer>("Sugar", "{area:exists}/{controller=Home}/{action=Index}/{id?}");
Однако всякий раз, когда я пытаюсь получить доступ к основному веб-сайту, который находится под маршрутом «по умолчанию», я продолжаю направляться в область «сахара». Есть ли правильный способ реализовать это?
Во-первых, с вашими кодами "Сахар" будет считаться партнером маршрута, вы должны удалить "Сахар"
Во-вторых
всякий раз, когда я пытаюсь получить доступ к основному веб-сайту, который находится под маршрут «по умолчанию», меня постоянно направляют в «сахарную» зону
проверить, существует ли субдомен:
var host = httpContext.Request.Host.Host;
var subDomain = host.Split(".").Count() > 1 ? host.Split(".").First() : "";
Если вы не хотите, чтобы вас перенаправляли в область Sugar, когда субдомен не существует, попробуйте
if (!string.IsNullOrEmpty(subDomain))
{
values["controller"] = subDomain;
values["area"] = subDomain;
}
else
{
values.Remove("area");
}
Я попытался с минимальным примером:
в программе.cs:
app.MapDynamicControllerRoute<SubDomainRouteTransformer>("{area}/{controller=Home}/{action=Index}/{id?}");
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
SubDomainRouteTransformer:
public class SubDomainRouteTransformer : DynamicRouteValueTransformer
{
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
var host = httpContext.Request.Host.Host;
var subDomain = host.Split(".").Count() > 1 ? host.Split(".").First() : "";
if (!string.IsNullOrEmpty(subDomain))
{
values["controller"] = subDomain;
values["area"] = subDomain;
}
else
{
values.Remove("area");
}
return values;
}
}
Результат:
Вам может понадобиться специальное промежуточное программное обеспечение, проверьте значение области в словаре routevalue и ваш поддомен, если они не совпадают, перенаправьте на поддомен, соответствующий области.
Спасибо тебе за это. Это действительно работает! Быстрый вопрос, как мне заставить работать перенаправление? т.е. из вашего примера автоматически перенаправить на поддомен из области?