【发布时间】:2020-02-19 19:35:44
【问题描述】:
我在同一台服务器上有多个应用程序,其中只有部分网络配置不同。因为其他一切都是一样的;是否可以以某种方式映射 aspx 和其他文件并让单个应用程序共享公共文件?这将更容易管理(es 更新文件)
【问题讨论】:
我在同一台服务器上有多个应用程序,其中只有部分网络配置不同。因为其他一切都是一样的;是否可以以某种方式映射 aspx 和其他文件并让单个应用程序共享公共文件?这将更容易管理(es 更新文件)
【问题讨论】:
一般而言,您可能希望使用continuous deployment 来最大程度地减少更新网络应用程序的工作量,请参阅此question 示例。
您可以尝试使用symbolic links 来处理重复文件,有关更多信息,请参阅以下答案:https://stackoverflow.com/a/3070093、https://stackoverflow.com/a/51679624。
【讨论】:
在我看来,如果你想更容易管理(es更新文件,我建议你可以编写web deploy命令行来一次将web应用程序部署到多个网站。
我不建议你为多个 IIS 服务器共享文件。
关于如何实现编写web deploy命令行将web应用一次部署到多个网站的详细信息,我建议你可以参考这个article。
【讨论】:
您将设置写入 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 子文件夹中的设置加载到公共静态类文件中。
此外,将文件存储在 App_Data/Sub-folder 中,您还可以将其存储在单独的数据库中,该数据库存储不同子域的所有设置。
更新 2
所有应用都可以通过子域来识别,因此你可以编写一个函数来获取子域,例如:
string[] sa = HttpContext.Current.Request.Url.Host.Split('.');
string SubDomain = sa[0];
你可以将它包装在一个类中:
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");
假设这是您的设置类对象:
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);
}
将其设为公共静态对象:
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();
}
}
然后在您的应用程序的其余部分中,您可以像这样调用设置参数:
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
好吧,你明白了。
【讨论】: