Я перепробовал множество решений, упомянутых в других темах, и обнаружил, что все становится слишком сложным очень быстро. Кажется, что ASP.Net MVC хочет, чтобы вы подкласс Route выполняли этот вид расширенной маршрутизации, но это никогда не работало для меня. Мне никогда не удавалось получить домен для сопоставления с пространством имен, поэтому я столкнулся с исключениями «неоднозначный контроллер» (поскольку у меня был домашний контроллер в обоих пространствах имен).
В конечном итоге я использовал ограничение для указания поддоменов на пространства имен.
Вот как выглядит мой маршрут. Обратите внимание, что этот маршрут для «API». суб-домен:
context.MapRoute(
"Api_Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = UrlParameter.Optional },
new { controller = new SubdomainRouteConstraint("api.") },
new[] { "BendyTree.CloudSpark.Areas.Api.Controllers" }
);
Вот класс "SubdomainRouteConstraint", указанный выше:
public class SubdomainRouteConstraint : IRouteConstraint
{
private readonly string SubdomainWithDot;
public SubdomainRouteConstraint(string subdomainWithDot)
{
SubdomainWithDot = subdomainWithDot;
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
return new Regex("^https?://" + SubdomainWithDot).IsMatch(httpContext.Request.Url.AbsoluteUri);
}
}
Это, очевидно, довольно взломанный, но я действительно доволен тем, как все просто закончилось.
Вы можете легко настроить этот код для динамического сопоставления субдомена с областью, но у меня есть только две области, поэтому я просто регистрирую каждую область отдельно. Кроме того, это дает мне свободу иметь разные маршруты внутри каждой области.