【问题标题】:Can I share same application files between multiple applications where only web.config is different?我可以在只有 web.config 不同的多个应用程序之间共享相同的应用程序文件吗?
【发布时间】:2020-02-19 19:35:44
【问题描述】:

我在同一台服务器上有多个应用程序,其中只有部分网络配置不同。因为其他一切都是一样的;是否可以以某种方式映射 aspx 和其他文件并让单个应用程序共享公共文件?这将更容易管理(es 更新文件)

【问题讨论】:

    标签: asp.net iis webforms


    【解决方案1】:

    一般而言,您可能希望使用continuous deployment 来最大程度地减少更新网络应用程序的工作量,请参阅此question 示例。

    您可以尝试使用symbolic links 来处理重复文件,有关更多信息,请参阅以下答案:https://stackoverflow.com/a/3070093https://stackoverflow.com/a/51679624

    【讨论】:

      【解决方案2】:

      在我看来,如果你想更容易管理(es更新文件,我建议你可以编写web deploy命令行来一次将web应用程序部署到多个网站。

      我不建议你为多个 IIS 服务器共享文件。

      关于如何实现编写web deploy命令行将web应用一次部署到多个网站的详细信息,我建议你可以参考这个article

      【讨论】:

        【解决方案3】:

        您将设置写入 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
        

        好吧,你明白了。

        【讨论】:

        • 可能我没有完全理解你,但 Application_Start(因为你有一个应用程序)将一劳永逸
        • @MarundeoRome 我已经更新了我的答案以显示如何在 Application_Start 中获取设置
        猜你喜欢
        • 2011-12-19
        • 1970-01-01
        • 2012-01-03
        • 2019-05-10
        • 2011-03-30
        • 2010-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多