[英]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中。 所以有幾個選項:
使用iframe並指向它以加載其他Web應用程序的頁面。 這將加載該應用程序的DLL以執行該頁面后面的代碼。 您可以讓用戶從該頁面導航到應用程序的其他頁面。
在shell應用程序中放置一個鏈接,單擊該鏈接時會將用戶導航到另一個應用程序的頁面。 同樣,將加載另一個應用程序的DLL以執行該頁面后面的代碼。
動態加載其他應用程序的用戶控件。 在shell應用程序中,您可以使用Page.LoadControl,然后將控件添加到shell應用程序中的某個占位符。 將加載另一個應用程序的DLL以執行后面的控件代碼。 Page.LoadControl要求您提供ASCX文件的URL。 您可以將此URL放在web.config文件或數據庫中,並可以在shell應用程序中加載不同的控件(也可以是不同應用程序的控件)。
使用反射動態創建其他應用程序的類的對象。 如果你這樣做,你可能希望你的shell應用程序引入一個可以通過其他Web應用程序類實現的接口,所以當你使用反射來創建這樣一個類的實例時,你知道它實現了什么接口,並且可以執行它的方法。
兩個第一選項是最簡單的,另外兩個選項更先進,更強大。 如果您提供有關您的用例的更多信息,也許我可以推薦最適合的用例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.