he intentado muchas de las soluciones mencionadas en otros hilos y encontraron cosas haciendo demasiado complicado muy rápidamente. Parece que ASP.Net MVC quiere que hagas una subclase de ruta para hacer este tipo de enrutamiento avanzado, pero nunca pareció funcionar para mí. Nunca pude hacer que un dominio se asignara a un espacio de nombres, así que terminé con excepciones de "controlador ambiguo" (ya que tenía un controlador doméstico en ambos espacios de nombres).
Al final usé una restricción para apuntar subdominios a espacios de nombres.
Así es como se ve mi ruta. Tenga en cuenta que esta ruta es para la "API". subdominio:
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" }
);
Ésta es la clase de "SubdomainRouteConstraint" hace referencia más arriba:
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);
}
}
Obviamente es un buen truco, pero estoy muy contento con lo simple que terminó.
Podría fácilmente cambiar este código para mapear dinámicamente un subdominio a un área, pero solo tengo dos áreas, así que solo registro cada área por separado. Además, esto me da la libertad de tener diferentes rutas dentro de cada área.
@mynameiscoffey, ¿ha tenido éxito en esto? Tengo exactamente la misma tarea. –