Изоляция в мультитенантном приложении ASP .NET - PullRequest
13 голосов
/ 10 октября 2010

Я создаю мультитенантное приложение ASP .NET.Учитывая, что каждый клиент может настроить свое приложение динамически (что может включать в себя загрузку динамических пользовательских сборок в память), мне нужны средства изоляции каждого клиента.

Я бы предпочел не создавать новое веб-приложение для каждого арендатора по причинам обслуживания.

Я рассматривал вопрос об использовании AppDomainManager для создания домена приложения для каждого приложения, но, похоже, это не такпредназначен для использования в приложениях ASP .NET.

У кого-нибудь есть предложения по этому вопросу?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 10 октября 2010

Наверное, вопрос в том, что если вы не занимаетесь созданием веб-приложения, то какой тип изоляции вам действительно подходит?

Если вам действительно нужна гарантия на уровне ОС, чтобы сборки не переходили друг на друга, я бы дал каждому свое веб-приложение.Это особенно верно, если вы позволяете людям загружать сторонние сборки, и особенно верно, если эти сторонние сборки могут найти способы создания неуправляемого кода.

Я вижу, что не создается отдельная сборкаВеб-приложение, если это весь ваш (управляемый) код, но после того, как вы добавили в микс динамические пользовательские сборки, я думаю, что это единственный путь.

1 голос
/ 20 октября 2010

Я написал мультитенантное веб-приложение в MVC2. Добавление / удаление учетной записи так же сложно, как добавление / удаление строки в таблице, так как я выбрал общую базу данных, подход с использованием общей схемы.

Это очень хорошая статья о мультитенантной базе данных MSDN: Мультитенантная архитектура данных

Все, что мне нужно было сделать в MVC, - правильно настроить маршрутизацию, поэтому первая часть пути - это имя учетной записи:

  • www.yourdomain.com / Account1 /...
  • www.yourdomain.com / account2 /...
  • www.yourdomain.com / account3 /...

и у меня есть пользовательский MvcHandler для поиска учетной записи для каждого запроса:

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

Как сказал Андреас Паулссон, ключевая фраза - "пользовательские сборки". Зачем вам нужны «пользовательские сборки» для конфигурации? Вы используете CodeEmit? Будут ли пользователи загружать их? Я бы предпочел использовать Windows Workflow Foundation для любой индивидуальной настройки бизнес-логики.

1 голос
/ 20 октября 2010

Когда вы создаете разные веб-сайты, ваш корень URL определенно изменится. Я думал, почему бы не разные приложения внутри основного приложения и поместить их в разные пулы приложений, если это необходимо?

Один ... Таким образом, корневой URL-адрес останется прежним. Два ... Создание VDir или экземпляра приложения. Какой из них должен быть динамичным? Три ... У меня нет опыта.

Если бы мне пришлось делиться страницами [на основе приложений, размещенных в другом VDir], я бы пошел на создание нового VDir для всех моих общих страниц. И используйте некоторый пользовательский код для отображения данных, связанных с приложением.

...