2010-10-10 12 views
13

Ich bin ein Multi-Tenant-ASP.NET-Anwendung erstellen. Da jeder Mandant seine Anwendung dynamisch konfigurieren kann (was zum Beispiel das Laden dynamischer benutzerdefinierter Assemblys in den Arbeitsspeicher erforderlich macht), muss ich die einzelnen Mandanten isolieren.Isolation in einer Multi-Tenant-ASP.NET-Anwendung

Ich möchte aus Wartungsgründen keine neue Webanwendung pro Mandant erstellen.

Ich habe erwogen, mit dem AppDomainManager eine AppDomain pro Anwendung zu erstellen, aber es scheint, dass dies nicht für ASP .NET-Anwendungen gedacht ist.

Hat jemand einige Vorschläge zu diesem Thema?

Danke.

Antwort

5

Ich denke, die Frage ist: Wenn Sie nicht in der Erstellung einer Webanwendung sind, welche Art von Isolation ist wirklich für Sie akzeptabel?

Wenn Sie wirklich eine Garantie auf Betriebssystemebene wünschen, dass Assemblys nicht aufeinander treten, würde ich jeder ihre eigene Webanwendung geben. Dies gilt insbesondere, wenn Sie Benutzern das Laden von Assemblys von Drittanbietern erlauben. Dies gilt insbesondere dann, wenn diese Assemblys von Drittanbietern Möglichkeiten finden, nicht verwalteten Code zu instanziieren.

Ich sehe keine separate Webanwendung erstellen, wenn es nur Ihr (verwalteter) Code ist, aber sobald Sie dynamische benutzerdefinierte Assemblies in den Mix einfügen, denke ich, dass dies der einzige Weg ist.

+0

Ich zweitens, der Schlüsselsatz ist "benutzerdefinierte Baugruppen". –

+0

Ok, ich bin definitiv bereit, das zu berücksichtigen, aber ich habe ein paar Bedenken. Einer - die Anwendungen sollten alle dieselbe Wurzel-URL haben ... ist das überhaupt möglich? Zwei - das Erstellen und Löschen muss automatisch sein ... sollte ich WMI dafür verwenden? Ich weiß nicht, wie ich darüber denke ... Und wie viele Webapps unterstützt IIs überhaupt? Wird das in einer Hardware-Wolke skalieren, da die Beschränkung dort das Os wäre? Drei - wir möchten, dass diese Lösung Azure-kompatibel (aber nicht Azure-spezifisch) ist. Wie also würde ich Azure verwalten? – Jeff

+0

Wie würden Sie auch die Verwendung von freigegebenen Ressourcen (Seiten) empfehlen? Ein VirtualPathProvider, der die Seite aus freigegebenen DLLs extrahiert? – Jeff

1

Wenn Sie verschiedene Websites erstellen, wird sich Ihr URL-Root definitiv ändern. Ich habe mir gedacht, warum nicht verschiedene Anwendungen in der Hauptanwendung, und sie in verschiedenen Anwendungspools bei Bedarf?

Eins ... Auf diese Weise würde die Stamm-URL gleich bleiben. Zwei ... Erstellen eines VDir oder einer Instanz einer Anwendung. Welche muss dynamisch sein? Drei ... Ich habe keine Erfahrung.

Wenn ich die Seiten teilen müsste, [basierend auf Anwendungen, die in verschiedenen VDir gehostet werden], würde ich für die Erstellung eines neuen VDir für alle meine geteilten Seiten gehen. Und verwenden Sie einen benutzerdefinierten Code, um anwendungsbezogene Daten anzuzeigen.

+0

Wie wäre es, wenn ich die Anwendungen dynamisch erstellen würde? – Jeff

+0

Wenn Sie IIS 7 verwenden, können Sie die Delegatkonfiguration von IIS Virtual Directories für Ihre Endbenutzer verwenden, damit sie ihre Anwendungen konfigurieren können. –

+0

ODER, Sie können SharePoint oder DotNetNuke verwenden. Wenn ich Ihre Frage richtig verstanden habe, können Sie mithilfe von SharePoint eine Websitedefinition erstellen und sie als Vorlage für ihre eigenen Websites verwenden. –

1

Ich schrieb Multi-Tenant-Web-Anwendung in MVC2. Das Hinzufügen/Entfernen eines Kontos ist so komplex wie das Hinzufügen/Entfernen einer Zeile in einer Tabelle, da ich mich für eine gemeinsame Datenbank, Shared-Schema-Ansatz, entschieden habe.

Dies ist ein sehr guter Artikel über Multi-Tenant-Datenbank-Design von MSDN: Multi-Tenant Data Architecture

Alles, was ich in MVC zu tun hatte, ist richtig Routing einzurichten, so dass der erste Teil des Pfades ist Kontoname :

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

und ich habe einen benutzerdefinierten MvcHandler zum Nachschlagen Konto für jede Anforderung:

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

Wie es von Andreas Paulsson der Schlüsselbegriff ist „benutzerdefinierter Assembly“ gesagt wurde. Warum benötigen Sie "Custom Assemblies" für die Konfiguration?Verwenden Sie CodeEmit? Werden Benutzer sie hochladen? Ich würde eher darüber nachdenken, Windows Workflow Foundation für jede kundenspezifische Business Logic-Anpassung zu verwenden.

+0

Ich habe eigentlich die mieterspezifischen MVC-Routen eingerichtet, die super funktionieren. Der Zweck für die benutzerdefinierten Assemblys ist, dass Mandanten in der Lage sein müssen, ihre "Instanz" mit benutzerdefinierten Seiten und Code-Hintern anzupassen. Das Isolieren von benutzerdefiniertem Code für diesen Zweck ist der Schlüssel. – Jeff

+0

Um weiter zu klären, ja, Benutzer werden die benutzerdefinierten Assemblys hochladen, die in der App-Domäne kompiliert und ausgeführt werden. Das Problem besteht darin, dass diese Assemblies eine Art von Isolation benötigen, um nicht auf Daten von anderen Mandanten zugreifen zu können. Ich habe bereits Code, der verhindert, dass die benutzerdefinierten Assemblys DB-Aufrufe vornehmen, aber ich mache mir Sorgen um statische Kontexte wie den Anwendungsstatus oder statische Eigenschaften/Methoden/Felder. – Jeff

+0

Ich habe darüber nachgedacht, App-Domains für diese benutzerdefinierten Assemblys dynamisch zu erstellen, aber ich würde etwas Integriertes bevorzugen, da asp.net bereits App-Domains für mich verwaltet. Plus, ich bin mir nicht sicher, wie ich meine benutzerdefinierte app-Domain in den asp. NET-Anfrage-Lebenszyklus bekommen würde (in der Lage, gerendert ASPX-Seiten) – Jeff