簡體   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