2008-12-09 9 views
5

Estoy buscando el uso de ASP.NET para un nuevo servicio SaaS, pero por amor a mí parece que no puedo averiguar cómo hacer búsquedas de cuentas basadas en subdominios como la mayoría de SaaS aplicaciones (por ejemplo, 37Signals) do.Búsqueda basada en cuentas en ASP.NET

Por ejemplo, si ofrezco yourname.mysite.com, ¿cómo usaría ASP.NET (MVC específicamente) para extraer el subdominio para poder cargar la plantilla correcta (mostrando el nombre de su compañía y similares)? ¿Se puede hacer con un enrutamiento regular?

Esto parece ser algo común en SaaS, así que tiene que haber una manera fácil de hacerlo en ASP.NET; Sé que hay complementos que lo hacen para otros frameworks como Ruby on Rails.

+0

Si está construyendo seriamente una aplicación SaaS y su equipo está teniendo dificultades con este tipo de cosas, tiene un problema con su proceso de contratación. – MarkR

+0

Meow Mark, corte! –

+0

Lo curioso es que no tengo un "equipo"; estaba preguntando cómo hacer esto por mí mismo porque mi aplicación SaaS estaba destinada a mi inicio de mISV. –

Respuesta

3

Esto funciona para mí:

//-------------------------------------------------------------------------------------------------------------------------- 
    public string GetSubDomain() 
    { 
     string SubDomain = ""; 

     if (Request.Url.HostNameType == UriHostNameType.Dns) 
      SubDomain = Regex.Replace(Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2"); 
     if (SubDomain.Length == 0) 
      SubDomain = "www"; 
     return SubDomain; 
    } 

Asumo que le gustaría para manejar múltiples cuentas dentro de la misma aplicación web en lugar de la construcción de sitios separados utilizando las herramientas en IIS. En nuestro trabajo, comenzamos creando un nuevo sitio web para cada subdominio, pero descubrimos que este enfoque no se escala bien, especialmente cuando publica una actualización y luego tiene que modificar docenas de sitios. Por lo tanto, recomiendo este enfoque en lugar de las técnicas orientadas al servidor sugeridas anteriormente basadas en varios años de experiencia haciendo exactamente lo que usted propone.

El código anterior simplemente se asegura de que se trata de una URL completamente formada (en lugar de, por ejemplo, una dirección IP) y devuelve el subdominio. Nos ha funcionado en un entorno de gran volumen.

2

Debería poder recoger esto de la colección ServerVariables, pero primero necesita configurar IIS y DNS para que funcionen correctamente. Así que ya sabes que 37Signals probablemente use Apache u otro servidor web unix de código abierto. En Apache esto se conoce como VirtualHosting.

Para hacer esto con IIS, necesitaría crear una nueva entrada de DNS (crear un CNAME yourname.mysite.com a application.mysite.com) para cada dominio que apunte a su aplicación en IIS (application.mysite.com)

Usted entonces create a host header entry in the IIS application (application.mysite.com) que aceptará el encabezado yourname.mysite.com. Los usuarios realmente presionarán application.mysite, com pero la dirección es el subdominio personalizado. A continuación, accede a la colección ServerVariables para obtener el valor para decidir cómo personalizar el sitio.

Nota: hay varias implementaciones alternativas que puede seguir dependiendo de los requisitos.

  • manejar el procesamiento de encabezado de host en un equilibrador de carga de hardware (más probables 37Signals hacer esto, de confiar en el servidor web), y crear un encabezado HTTP personalizado para pasar a la aplicación web.
  • Cree una nueva aplicación web y encabezado de host para cada aplicación individual. Esta es probablemente una implementación ineficiente para una gran cantidad de usuarios, pero podría ofrecer un mejor aislamiento y seguridad para algunas personas.
0

La forma en que lo he hecho es con HttpContext.Request.ServerVariables ["HTTP_HOST"]. Split (".").

Avíseme si necesita más ayuda.

1

Necesita configurar su DNS para admitir subdominios comodín.Se puede hacer mediante la adición de una A que apunta registro de su dirección IP, así:

* A 1.2.3.4 

Una vez que su hecho, lo que se ingrese antes de que se le enviará a su dominio a su dominio raíz, donde se puede obtener mediante la división del Variable del servidor HTTP_HOST, como los errores del usuario mencionados anteriormente:

string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".") 

//use the user variable to query the database for specific data 

PS. Si está utilizando un alojamiento compartido, es probable que tenga que hacerlo mediante un complemento de IP única, ya que es obligatorio que los dominios comodín funcionen. Si está usando un hosting dedicado, ya tiene su propia IP.

Cuestiones relacionadas