Búsqueda basada en cuenta en ASP.NET

votos
5

Estoy buscando usar ASP.NET para un nuevo servicio de SaaS, pero por amor a mí, parece que no puedo imaginar cómo hacer búsquedas de cuentas basadas en subdominios como lo hacen la mayoría de las aplicaciones de SaaS (por ejemplo, 37Signals).

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.

Publicado el 09/12/2008 a las 17:59
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
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;
    }

Supongo que le gustaría manejar varias cuentas dentro de la misma aplicación web en lugar de crear sitios separados usando 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 (más bien, digamos, que una dirección IP) y devuelve el subdominio. Nos ha funcionado en un entorno de gran volumen.

Respondida el 15/12/2008 a las 15:22
fuente por usuario

votos
2

Debería poder recoger esto desde 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, deberá crear una nueva entrada de DNS (cree un CNAME, sunname.mysite.com en application.mysite.com) para cada dominio que apunte a su aplicación en IIS (application.mysite.com).

A continuación, crea una entrada de encabezado de host en la aplicación IIS (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.

  • Maneje el procesamiento del encabezado del host en un equilibrador de carga de hardware (lo más probable es que 37Signals hagan esto, que confíe en el servidor web), y cree un encabezado HTTP personalizado para pasar a la aplicación web.
  • Cree una nueva aplicación web y un 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.
Respondida el 09/12/2008 a las 18:22
fuente por usuario

votos
1

Necesita configurar su DNS para admitir subdominios comodines. Se puede hacer agregando un registro A que apunta a su dirección IP, como este:

* A 1.2.3.4

Una vez hecho esto, lo que escribas antes de que tu dominio se envíe a tu dominio raíz, donde puedes dividir la variable de servidor HTTP_HOST, como los errores de usuario mencionados anteriormente:

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

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

PD. 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.

Respondida el 05/01/2009 a las 23:36
fuente por usuario

votos
0

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

Dejame saber si necesitas mas ayuda.

Respondida el 15/12/2008 a las 15:19
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more