13

マルチテナントのASP.NETアプリケーションを構築しています。各テナントがアプリケーションを動的に構成できることを考えると(動的なカスタムアセンブリがメモリにロードされることが含まれる場合があります)、各テナントを分離する手段が必要です。

メンテナンス上の理由から、テナントごとに新しいWebアプリケーションを作成したくありません。

AppDomainManagerを使用してアプリケーションごとにAppDomainを作成することを検討していましたが、これはASP.NETアプリケーションでの使用を目的としたものではないようです。

誰かがこの主題についていくつかの提案がありますか?

ありがとう。

4

3 に答える 3

5

問題は、Web アプリケーションの作成に興味がない場合、どのタイプの分離が実際に受け入れられるかということだと思います。

アセンブリが相互に干渉しないという OS レベルの保証が本当に必要な場合は、それぞれに独自の Web アプリケーションを提供します。これは、サードパーティ アセンブリの読み込みを許可している場合に特に当てはまり、それらのサードパーティ アセンブリがアンマネージ コードをインスタンス化する方法を見つけられる場合に特に当てはまります。

すべてが (マネージ) コードである場合は、別の Web アプリケーションを作成しないことがわかりますが、動的カスタム アセンブリをミックスに入れたら、それが唯一の方法だと思います。

于 2010-10-10T14:41:19.570 に答える
1

MVC2 でマルチテナント Web アプリケーションを作成しました。アカウントの追加/削除は、共有データベース、共有スキーマ アプローチを選択したため、テーブル内の行の追加/削除と同じくらい複雑です。

これは、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);
    }
}

Andreas Paulsson が言ったように、キー フレーズは「カスタム アセンブリ」です。構成に「カスタム アセンブリ」が必要なのはなぜですか? CodeEmit を使用していますか? ユーザーはそれらをアップロードしますか? クライアント固有のビジネス ロジックのカスタマイズには、Windows Workflow Foundationを使用することを検討したいと思います。

于 2010-10-20T05:35:27.020 に答える
1

さまざまな Web サイトを作成すると、URL ルートは確実に変更されます。メイン アプリケーション内に別のアプリケーションを配置して、必要に応じて別のアプリケーション プールに配置しない理由を考えていました。

1 つ... そうすれば、ルート URL は同じままになります。2 つ... VDir またはアプリケーションのインスタンスを作成します。動的にする必要があるのはどれですか? 3... 私には専門知識がありません。

[別の VDir でホストされているアプリケーションに基づいて] ページを共有する必要がある場合、すべての共有ページ用に新しい VDir を作成します。また、カスタム コードを使用して、アプリケーション関連のデータを表示します。

于 2010-10-20T05:17:27.657 に答える