繁体   English   中英

我可以在仅 web.config 不同的多个应用程序之间共享相同的应用程序文件吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM