Respuesta

11

Las áreas no están directamente relacionadas con el enrutamiento, por lo que su pregunta se convierte en "¿admite subdominios de enrutamiento?"

Desafortunadamente, la respuesta a esto es que no hay soporte incorporado para esto.

Sin embargo, la buena noticia es que muchas personas han intentado y han tenido éxito con código personalizado que se acumula en la parte superior de enrutamiento:

Si descubres cómo enrutar subdominios sin áreas, entonces hacerlo con áreas no debería ser más difícil. Vaya al contexto de registro de su área y use la técnica que elija allí. Las áreas son solo una forma de agrupar controladores y vistas: no tienen mucho significado intrínseco para ASP.NET MVC (lo hacen un poco, pero no mucho).

+1

+1 para una respuesta bastante aclaratoria. –

5

Puede asignar dominios o subdominios a un área MVC2 fácilmente utilizando el módulo de reescritura de URL IIS7. Aquí hay dos reglas simples que mapean subdominios a dos áreas. Agregué una restricción para no usar esta regla si la solicitud es para un archivo real (es decir, CSS, JS o archivos de imagen).

Aquí está la configuración de ejemplo que va a la derecha en su web.config:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="SubA Area"> 
       <match url=".*" /> 
       <action type="Rewrite" url="/SubA/{R:0}" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="suba.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
      </rule> 
      <rule name="SubB Area"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{HTTP_HOST}" pattern="subb.mydomain.com" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
       </conditions> 
       <action type="Rewrite" url="/SubB/{R:0}" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

Vas a tener que cambiar las reglas a continuación para trabajar con su caso en particular. Especialmente si tiene controladores en el área raíz que necesita usar. En ese caso, simplemente agregue una condición o cree una nueva regla.

Descargar el módulo de IIS reescritura de URL (requerido): http://learn.iis.net/page.aspx/460/using-the-url-rewrite-module/

3

di con el mismo problema y he construido una solución que funcionó para mí, lo llevo en la blog, espero que sea de alguna utilidad para ti.

Saludos , Tony

1

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.

+0

Lamentablemente no me funciona. Tengo 2 controladores domésticos, uno de ellos está en el subdominio. Se lanza como otras soluciones 'Se encontraron varios tipos que coinciden con el controlador llamado' Inicio '' excepción. Cuando lo cambio el nombre por el nombre único funciona bien. Pero no está claro cómo se generan enlaces al subdominio? He intentado @ Html.RouteLink ("Móvil", "api_default") pero genera un enlace a la página principal de la aplicación ... – Cheburek

Cuestiones relacionadas