[英]Can I share same application files between multiple applications where only web.config is different?
我在同一台服務器上有多個應用程序,其中只有 web 配置的某些部分不同。 因為其他一切都是一樣的; 是否有可能 map 以某種方式獲取 aspx 和其他文件並讓單個應用程序共享公共文件? 這將使管理更容易(es更新文件)
通常,您可能希望使用持續部署來最大程度地減少更新 web 應用程序的工作量,請參閱此問題以獲取示例。
您可以嘗試使用符號鏈接來處理重復文件,有關更多信息,請參閱以下答案: https://stackoverflow.com/a/3070093、https ://stackoverflow.com/a/51679624 。
在我看來,如果您想更容易管理(es 更新文件,我建議您可以編寫 web deploy 命令行以將 web 應用程序一次部署到多個 web 站點。
我不建議您共享多個 IIS 服務器的文件。
關於如何實現一次編寫web deploy命令行將web應用程序部署到多個web站點的詳細信息,建議您可以參考這篇文章。
您將設置寫入 App_Data 文件夾中的“ini”文本文件。
例如,如果您有以下使用相同應用程序文件夾的子域:
http://sub1.myweb.com
http://sub2.myweb.com
http://sub3.myweb.com
然后您可以將設置或配置參數存儲在以下文件夾中:
/root/App_Data/sub1/settings.ini
/root/App_Data/sub2/settings.ini
/root/App_Data/sub3/settings.ini
然后,在 Application_Start 中的 Global.asax 中,將 App_Data 子文件夾中的設置加載到公共 static class 文件中。
此外,將文件存儲在 App_Data/Sub-folder 中,您也可以將其存儲在單獨的數據庫中,該數據庫存儲不同子域的所有設置。
更新 2
所有應用程序都可以通過其子域進行識別,因此您可以編寫 function 來獲取子域,例如:
string[] sa = HttpContext.Current.Request.Url.Host.Split('.');
string SubDomain = sa[0];
您可以將其包裝在 class 中:
public class config
{
private static string _subdomain = null;
public static string SubDomain
{
get
{
if (_subdomain == null)
{
string[] sa = HttpContext.Current.Request.Url.Host.Split('.');
_subdomain = sa[0];
}
return _subdomain;
}
}
}
這將允許您像這樣獲得子域:
config.SubDomain
接下來是設置文件的物理文件路徑:
HttpContext.Current.Server.MapPath($"~/App_Data/{config.SubDomain}/settings.ini");
假設這是您的設置 class object:
public class AppSettings
{
public string BranchOfficeName { get; set; }
public string ManagerName { get; set; }
public string Address { get; set; }
public DateTime ExpiryDate { get; set; }
public int MemberLimit { get; set; }
}
您可以像這樣加載設置:
private static AppSettings _appset = null;
public static void LoadSettings()
{
string settingsFilePath = HttpContext.Current.Server.MapPath($"~/App_Data/{config.SubDomain}/settings.ini");
_appset = ConvertIniToClassObject(settingsFilePath);
}
將其設為公共 static object:
private static AppSettings _appset = null;
public static AppSettings Settings
{
get
{
if (_appset == null)
{
LoadSettings();
}
return _appset;
}
}
public static void LoadSettings()
{
string settingsFilePath = HttpContext.Current.Server.MapPath($"~/App_Data/{config.SubDomain}/settings.ini");
_appset = ConvertIniToClassObject(settingsFilePath);
}
因此,在您的 Global.Application_Start 中,加載設置:
public class Global : System.Web.HttpApplication
{
protected void Application_Start(object sender, EventArgs e)
{
config.LoadSettings();
}
}
然后在您的應用程序的 rest 中,您可以像這樣調用設置參數:
string output = $@"
<h1>{config.Settings.BranchOfficeName}</h1>
Manager: {config.Settings.ManagerName}<br />
Address: {config.Settings.Address}<br />
Sub-Domain: {config.SubDomain}<br />";
HttpContext.Current.Response.Write(output);
以下是保存設置文件的示例:
public static void SaveSettings()
{
string ini = ConvertObjectToIni(_appset);
string settingsFilePath = HttpContext.Current.Server.MapPath($"~/App_Data/{config.SubDomain}/settings.ini");
System.IO.File.WriteAllText(settingsFilePath, ini);
}
因此,在應用程序中,只需調用:
config.SaveSettings();
除了將設置存儲在物理 ini 文件中,您還可以將其存儲在數據庫中:
SELECT * FROM appsettings WHERE subdomain={config.SubDomain}
這里的關鍵點是config.SubDomain 。 因此,除了設置之外,您現在可以根據子域單獨存儲其他文件,例如:
/images/{config.SubDomain}/logo.jpg
/files/{config.SubDomain}/rules.pdf
反正你懂這個意思。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.