簡體   English   中英

如何發現和加載一個Web應用程序到另一個?

[英]How to discover and load one web application into another?

我現在一直在谷歌搜索,也許我不是在尋找正確的術語。 我想擁有一個能夠加載/運行其他Web應用程序的“shell”asp.net Web應用程序(就像prism對Silverlight xap文件一樣)。 但是,除了“子項目”之外,我似乎無法找到任何其他版本,這需要將項目添加到解決方案中。 我只是想將WebApplicationB.dll放到Bin文件夾中,讓ShellWebApplication加載dll並在iframe中顯示默認頁面。

如何做到這一點或在哪里可以找到有關如何做到這一點的信息?

更新:向可以顯示代碼或指向我的示例項目的人提供獎勵,以顯示如何完成此操作。 希望能夠“加載”另一個asp.net網站/ Web應用程序及其依賴項(dll或no)並顯示加載的asp.net Web應用程序的default.aspx起始頁面,而不更改已包含shell的Visual Studio解決方案asp.net Web應用程序。

這實際上是相當微不足道的; 我們做到了。

主要關鍵是您的“模塊”應該有自己的內容文件夾,或者您需要注意不要在同一位置具有完全相同的文件名。

考慮以下人為的例子:

Shell
  \default.aspx
  \login.aspx
  \Images          <- images used by shell
  \css             <- primary CSS files
  \Pages\Accounts  <- all of the account editing pages here.

Module1
  \Module1\Pages       <- web pages specific to Module 1 
  \Module1\Images      <- images specific to module 1
  \CSS\Module1.css     <- Optionally, you can place the Module 1 CSS file into the main CSS directory.  

使用此結構,您將能夠將兩個Web應用程序復制到同一目標目錄中。 由於.Net功能如何正常工作,兩者都將在同一個進程空間內執行。

當然,您需要一種方法讓Shell了解模塊1.您希望能夠在沒有Module1的情況下部署Shell。 這里最好的方法是添加一個包含所需接口定義的程序集項目。 您將此項目的引用添加到Shell和Module 1.類似於:

Core
  \ObjectModel\MenuOption.cs
  \Extension\IAppModule.cs
  \Extension\PluginFactory.cs

IAppModule.cs看起來像這樣:

public interface IAppModule {
  Collection<MenuOption> GetMenu( );
}

MenuOption.cs看起來像:

public class MenuOption {
  public string Href { get; set; } // url the option goes to
  public string Title { get; set; } // display name of the menu option
}

PluginFactory.cs類似於:

public sealed class PluginFactory {
  PlugingFactory() { }

  public static IAppModule LoadPlugin( string typeName ) {
    Type theType = Type.GetType(typeName);
    return (IAppModule)Activator.CreateInstance(theType);
  }
}

GetMenu的目的是返回模塊中可用頁面的引用集合。

在Module1中,你將實現如下界面:

public class AppModule : IAppModule {
  public Collection<MenuOption> GetMenu() {
    Collection<MenuOption> result = new Collection<MenuOption>();
    result.add(new MenuOption() { Href = "~/Module1/Pages/AccountList.aspx", Title="Account List"});
    result.add(new MenuOption() { Href = "~/Module1/Pages/NewAccount.aspx", Title="New Account"});

    return result;
  }
}

因此,此時我們有2個Web應用程序項目和1個組裝項目。 Web應用程序項目彼此之間不知道任何事情。

下一步是告訴Shell,Module1存在。 我們通過提供可用模塊的數據庫表來實現這一點。 您可以在web.config文件中執行相同的操作。 主要的是shell項目需要Type Name並引用Module 1的AppModule類。 例如:“ Module1.AppModule, Module1

然后,在shell主頁面中,您可以執行以下操作:

protected void LoadMenu() {
  // get list of available modules, just assuming mdules is string[] 
  foreach(String moduleId in moduleIds) {
    IAppModule module = PluginFactory.LoadPlugin(moduleId);    // now you have a reference to the module
    Collection<MenuOption> options = module.GetMenu();
    // and now we have all of the menu options for that module...

  }
}

對於獎勵積分,我們在shell項目的根目錄中有一個名為“Main.master”的Master頁面。我們的每個模塊的根目錄中都有一個“Main.master”母版頁。 模塊中的那些將構建操作設置為none,並將復制到輸出設置為Do not copy。

母版頁是我們實際加載菜單選項的地方。 此外,每個模塊中的所有其他主服務器都繼承自此主模塊。 有趣的是,后代母版頁並不關心父母的實際“類型”,只關心該頁面的位置。 這意味着您可以從shell控制主母版頁,並讓每個模塊“繼承”,只需通過NOT部署其整體母版頁即可。

例如:

Shell
  /main.master  <- includes the basic CSS references, content structure and loads the various menus.

Module1
  /main.master  <- this file will NEVER be deployed and is only here to aid in testing the module independently of the shell
  /Module1/Module1.master <- inherits from main.master, adding other common elements for the module.

由於母版頁繼承的工作方式,Module1.master文件通過“〜/ main.master”引用它的父級。 通過不部署模塊main.master而只是部署shell的main.master,我們獲得了很大的靈活性。

最后,您可以將shell項目部署到IIS服務器上。 稍后您可以在shell項目的頂部部署ModuleX(不需要虛擬目錄),它就可以正常工作。

該DLL包含Web應用程序的已編譯代碼。 “加載dll”沒有意義。 您可能想要加載控件或頁面,然后讓用戶導航到此應用程序中的其他頁面或控件,其代碼也包含在此dll中。 所以有幾個選項:

  1. 使用iframe並指向它以加載其他Web應用程序的頁面。 這將加載該應用程序的DLL以執行該頁面后面的代碼。 您可以讓用戶從該頁面導航到應用程序的其他頁面。

  2. 在shell應用程序中放置一個鏈接,單擊該鏈接時會將用戶導航到另一個應用程序的頁面。 同樣,將加載另一個應用程序的DLL以執行該頁面后面的代碼。

  3. 動態加載其他應用程序的用戶控件。 在shell應用程序中,您可以使用Page.LoadControl,然后將控件添加到shell應用程序中的某個占位符。 將加載另一個應用程序的DLL以執行后面的控件代碼。 Page.LoadControl要求您提供ASCX文件的URL。 您可以將此URL放在web.config文件或數據庫中,並可以在shell應用程序中加載不同的控件(也可以是不同應用程序的控件)。

  4. 使用反射動態創建其他應用程序的類的對象。 如果你這樣做,你可能希望你的shell應用程序引入一個可以通過其他Web應用程序類實現的接口,所以當你使用反射來創建這樣一個類的實例時,你知道它實現了什么接口,並且可以執行它的方法。

兩個第一選項是最簡單的,另外兩個選項更先進,更強大。 如果您提供有關您的用例的更多信息,也許我可以推薦最適合的用例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM