2010-10-10 14 views
13

Estoy creando una aplicación ASP .NET de múltiples usuarios. Dado que cada inquilino puede configurar su aplicación de forma dinámica (lo que puede implicar ensamblados personalizados dinámicos que se cargan en la memoria), necesito un medio para aislar a cada inquilino.Aislamiento en una aplicación ASP .NET de múltiples usuarios

Preferiría no crear una nueva aplicación web por inquilino por motivos de mantenimiento.

Estuve considerando utilizar AppDomainManager para crear un AppDomain por aplicación, pero parece que no está destinado a ser utilizado para aplicaciones ASP .NET.

¿Alguien tiene alguna sugerencia sobre este tema?

Gracias.

Respuesta

5

Supongo que la pregunta es: si no está interesado en crear una aplicación web, ¿qué tipo de aislamiento es realmente aceptable para usted?

Si realmente desea una garantía de nivel de sistema operativo que los ensamblados no se pisen entre sí, le daría a cada uno su propia aplicación web. Esto es especialmente cierto si permite que las personas carguen montajes de terceros, y es súper especialmente cierto si esos ensamblados de terceros pueden encontrar formas de crear instancias de código no administrado.

Veo que no puedo crear una aplicación web por separado si es todo su código (administrado), pero una vez que coloca conjuntos personalizados dinámicos en la mezcla, creo que es la única manera de hacerlo.

+0

En segundo lugar, la frase clave es "ensambles personalizados". –

+0

Ok, definitivamente estoy dispuesto a considerar eso, pero tengo algunas preocupaciones. Uno: todas las aplicaciones deberían tener la misma URL raíz ... ¿es esto posible? Dos: la creación y la eliminación deben ser automáticas ... ¿Debería usar WMI para eso? No sé cómo me siento acerca de eso ... ¿Y cuántos webapps admite II de todos modos? ¿Esa escala en una nube de hardware, ya que la limitación sería el sistema operativo? Tres: queremos que esta solución sea compatible con Azure (pero no específica de Azure), entonces, ¿cómo podría administrarla para Azure? – Jeff

+0

Además, ¿cómo recomendaría el manejo de recursos compartidos (páginas)? Un VirtualPathProvider que extrae la página de dlls compartidos? – Jeff

1

Cuando crea diferentes sitios web, la raíz de su URL definitivamente va a cambiar. Estaba pensando por qué no diferentes aplicaciones dentro de la aplicación principal, y las puse en diferentes grupos de aplicaciones si es necesario.

Uno ... De esta forma, la URL raíz se mantendría igual. Dos ... Crea un VDir o una instancia de una aplicación. ¿Cuál necesita ser dinámico? Tres ... No tengo experiencia.

Si tuviera que compartir las páginas, [basado en aplicaciones alojadas en diferentes VDir], me gustaría crear un nuevo VDir para todas mis páginas compartidas. Y use algún código personalizado para mostrar datos relacionados con la aplicación.

+0

Sin embargo, ¿cómo sería la creación dinámica de las aplicaciones? – Jeff

+0

Si está utilizando IIS 7, puede usar la configuración de delegado de los directorios virtuales de IIS a sus usuarios finales para que puedan configurar sus aplicaciones. –

+0

O bien, puede usar SharePoint o DotNetNuke. Si entiendo su pregunta correctamente, puede usar SharePoint para crear una Definición del sitio y que alguien la use como plantilla para sus propios sitios. –

1

Escribí la aplicación web multi-tenant en MVC2. Agregar/Eliminar una cuenta es tan complejo como agregar/eliminar una fila en una tabla cuando opté por la base de datos compartida, enfoque de esquema compartido.

Este es un artículo muy bueno sobre el diseño de la base de datos de múltiples usuarios de MSDN: Multi-Tenant Data Architecture

Todo lo que tenía que hacer en MVC es configurar el enrutamiento correctamente, por lo que la primera parte de la ruta es el nombre de cuenta :

  • www.yourdomain.com/Account1/...
  • www.yourdomain.com/Account2/...
  • www.yourdomain.com/Account3/...

y tengo una MvcHandler personalizada para buscar la cuenta para cada solicitud:

public class AccountMvcHandler : MvcHandler 
{ 
    public AccountModel Account { get; set; } 

    public AccountMvcHandler(RequestContext requestContext) 
     : base(requestContext) 
    { 
    } 

    protected override IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state) 
    { 
     string accountName = this.RequestContext.RouteData.GetRequiredString("account"); 
     Account = ServiceFactory.GetService<IAccountService>().GetAccount(accountName); 

     // URL doesn't contain valid account name - redirect to login page with Account Name textbox 
     if (Account == null) 
      httpContext.Response.Redirect(FormsAuthentication.LoginUrl); 

     return base.BeginProcessRequest(httpContext, callback, state); 
    } 
} 

como fue dicho por Andreas Paulsson la frase clave es "ensamblados personalizados". ¿Por qué necesita 'ensambles personalizados' para la configuración?¿Estás usando CodeEmit? ¿Los usuarios los subirán? Preferiría pensar en usar Windows Workflow Foundation para cualquier personalización de lógica de negocio específica del cliente.

+0

De hecho, tengo configuradas las rutas MVC específicas para el inquilino, que funcionan muy bien. El propósito de los ensamblajes personalizados es que los inquilinos deben poder personalizar su "instancia" con páginas personalizadas y códigos subyacentes. Aislar cualquier código personalizado para este propósito es la clave. – Jeff

+0

Para aclarar aún más, sí, los usuarios subirán los ensamblajes personalizados, que se compilarán y ejecutarán en el dominio de la aplicación. El problema es que estos ensambles necesitan algún tipo de aislamiento para no poder acceder a los datos de otros inquilinos. Ya tengo un código que impide que los ensamblados personalizados realicen llamadas a bases de datos, pero me preocupan los contextos estáticos, como el estado de la aplicación o las propiedades/métodos/campos estáticos. – Jeff

+0

He considerado crear dominios de aplicaciones dinámicamente para estos ensamblados personalizados, pero preferiría algo integrado, ya que asp .net ya está administrando dominios de aplicaciones para mí. Además, no estoy seguro de cómo conseguiría mi dominio de aplicación personalizado en el ciclo de vida de solicitud asp .NET (capaz de emitir páginas renderizadas de aspx) – Jeff

Cuestiones relacionadas