2010-10-10 9 views
13

Buduję aplikację ASP .NET dla wielu dzierżawców. Biorąc pod uwagę, że każdy lokator może dynamicznie konfigurować swoją aplikację (co może wiązać się z dynamicznymi niestandardowymi zestawami ładowanymi do pamięci), potrzebuję sposobu na wyodrębnienie każdego dzierżawcy.Izolacja w aplikacji ASP.NET dla wielu dzierżawców.

Wolałbym nie tworzyć nowych aplikacji internetowych na jednego dzierżawcę ze względów konserwacyjnych.

Rozważałem użycie AppDomainManager do stworzenia AppDomain dla aplikacji, ale wydaje się, że nie jest to przeznaczone do stosowania w aplikacjach ASP .NET.

Czy ktoś ma jakieś sugestie na ten temat?

Dzięki.

Odpowiedz

5

Domyślam się, że pytanie brzmi: jeśli nie jesteś w tworzeniu aplikacji sieciowej, to jaki rodzaj izolacji jest naprawdę do zaakceptowania?

Jeśli naprawdę chcesz mieć gwarancję na poziomie systemu operacyjnego, że złoenia nie będą przebiegać jedna na drugą, to podaję ich własne aplikacje internetowe. Jest to szczególnie ważne, jeśli pozwalasz ludziom ładować układy innych firm i jest to wyjątkowo ważne, jeśli te zestawy innych producentów mogą znaleźć sposoby na tworzenie instancji niezarządzanego kodu.

Widzę, że nie tworzę oddzielnej aplikacji internetowej, jeśli to wszystko jest twoim (zarządzanym) kodem, ale gdy umieścisz dynamiczne niestandardowe złożenia w miksie, myślę, że to jedyny sposób, aby przejść.

+0

Po drugie, fraza kluczowa to "niestandardowe złoŜenia". –

+0

Ok, zdecydowanie chcę to rozważyć, ale mam kilka obaw. Jeden - wszystkie aplikacje powinny mieć ten sam główny adres URL ... czy to jest możliwe? Dwa - tworzenie i usuwanie musi być automatyczne ... czy powinienem używać do tego WMI? Nie wiem, co o tym myślę ... A ilu webappów wspierają IIs? Czy ta skala będzie w chmurze sprzętu, skoro ograniczenie będzie miało os? Trzy - chcemy, aby to rozwiązanie było zgodne z Azure (ale nie na platformie Azure), więc jak mam go zarządzać w systemie Azure? – Jeff

+0

Co więcej, jak radzisz z obsługą zasobów udostępnionych (stron)? VirtualPathProvider, który wyodrębnia stronę z udostępnionych bibliotek dll? – Jeff

1

Kiedy tworzysz różne strony internetowe, twój root adresu URL zdecydowanie się zmieni. Zastanawiam się, dlaczego nie różne aplikacje w głównej aplikacji i umieścić je w różnych pulach aplikacji, jeśli jest to wymagane?

Jeden ... W ten sposób główny adres URL pozostanie taki sam. Dwa ... Tworzenie VDir lub wystąpienie aplikacji. Który z nich musi być dynamiczny? Trzy ... Nie mam żadnej wiedzy.

Gdybym musiał udostępnić strony, [w oparciu o aplikacje hostowane w różnych VDir], chciałbym stworzyć nowy VDir dla wszystkich moich wspólnych stron. Użyj niestandardowego kodu, aby wyświetlić dane związane z aplikacją.

+0

Jak jednak postępować w kwestii dynamicznego tworzenia aplikacji, to jest pytanie? – Jeff

+0

Jeśli korzystasz z IIS 7, możesz używać delegowanych konfiguracji wirtualnych katalogów IIS do użytkowników końcowych, aby mogli konfigurować swoje aplikacje. –

+0

LUB, możesz użyć SharePoint lub DotNetNuke. Jeśli poprawnie zrozumiem twoje pytanie, możesz użyć SharePointa, aby utworzyć definicję strony, a ktokolwiek użyje go jako szablonu dla swoich witryn. –

1

Napisałem aplikację internetową dla wielu dzierżawców w MVC2. Dodawanie/usuwanie konta jest tak złożone, jak dodawanie/usuwanie wiersza w tabeli, ponieważ wybrałem udostępnioną bazę danych, współużytkowane podejście do schematu.

Jest to bardzo dobry artykuł o multi-tenant projektowania baz danych z MSDN: Multi-Tenant Data Architecture

Wszystko co musiałem zrobić w MVC jest skonfigurować routing prawidłowo, więc pierwsza część ścieżki jest nazwa konta :

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

i mam niestandardowy MvcHandler dla patrząc konto dla każdego żądania:

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

Jak to zostało powiedziane przez Andreas Paulsson kluczem fraza to „niestandardowe zespoły”. Dlaczego potrzebujesz "niestandardowych złożeń" do konfiguracji?Czy używasz CodeEmit? Czy użytkownicy będą je przesyłać? Wolałbym pomyśleć o użyciu Windows Workflow Foundation dla każdej specyficznej dla klienta dostosowywania logiki biznesowej.

+0

Mam właściwie skonfigurowane trasy dla MVC najemców, które działają świetnie. Celem niestandardowych złożeń jest to, że lokatorzy muszą mieć możliwość dostosowania swojej "instancji" za pomocą niestandardowych stron i podpowiedzi kodu. Kluczem jest wyodrębnianie dowolnego niestandardowego kodu do tego celu. – Jeff

+0

Aby dodatkowo wyjaśnić, tak, użytkownicy będą przesyłać niestandardowe zestawy, które zostaną skompilowane i uruchomione w domenie aplikacji. Problem polega na tym, że te zespoły potrzebują pewnej formy izolacji, aby nie mieć dostępu do danych od innych lokatorów. Mam już kod, który uniemożliwia niestandardowym złoeniom wykonywanie wywołań DB, ale niepokoją mnie konteksty statyczne, takie jak stan aplikacji lub statyczne właściwości/metody/pola. – Jeff

+0

Zastanowiłem się nad dynamicznym tworzeniem domen aplikacji dla tych niestandardowych złożeń, ale wolałbym coś zintegrowanego, ponieważ asp .net już zarządza domenami aplikacji. Ponadto nie jestem pewien, w jaki sposób uzyskałabym swoją domenę aplikacji niestandardowej w cyklu życia żądania asp.net (możliwość wydawania renderowanych stron aspx). – Jeff

Powiązane problemy