Web.config和App.config的问题

时间:2009-09-04 16:41:57

标签: asp.net web-config app-config

说明:

  • 通常我们会在ConnectionStrings<appSettings> <add key...中存储Web.config和其他一些设置(App.config)。

我的风景:

  • 使用工厂模式的Web应用程序 用直接注入来读取数据 提供者。

  • web.config我有钥匙 告诉我哪个DLL(提供者) 我会用来检索我的数据。

  • 我可以拥有多个提供商 (每个DLL都是MS的提供者 SQL,MySQL或从中获取数据 一些SOA服务)。

  • 每个DLL都有自己的名称(ID和名称空间),并且需要拥有自己的名称 配置(dataconnections, 服务网址等),第一个 想法是写在那里 app.config

问题:

  • #1 - 网站正在运行(运行时)我需要更改数据提供程序,我该怎么做?不知何故写入的默认值Web.config将被更改。

    • 我的目标是能够拥有多个提供商(并且在运行时:添加/删除提供商和更改配置) - 这引出了我的第二个问题:

  • #2 - 每个数据提供程序都有自定义配置,而App.Config文件不适用于dll程序集,只能用于可执行文件。这意味着我需要在我的Web.Config上编写(我不喜欢这个选项,因为我再次在运行时更新我的​​web.config)。 我该如何解决?

    • 我试图避免编写自定义设置XML文件。我理想的解决方案是以某种方式部署每个提供商的DLLDLL.config。并且在运行时期间我可能需要更改此配置值。

4 个答案:

答案 0 :(得分:5)

好的,伙计们,当我在等待一些帮助时,我把手放在上班,我找到了一个很好的解决方案(当然我认为是这样的:P)。

让我与您分享:

因此,我有一个Web应用程序,或一个控制台应用程序,或其他类型的应用程序,以及许多类库,我需要存储将在运行时更改的信息(每个Visual Studio项目不同)。

将此信息存储在Web.configApp.config内并不是一个好主意,因为它需要解决许多问题。

我认为另一种方法是每个项目都有一个XML配置文件。

每个应用程序都将读取自己的XML,并使用CacheDependency将其添加到缓存中(更新XML配置文件时将过期)。这样我们就不需要一直读取配置,也知道配置何时更改。

IMO THIS IS THE FASTEST AND EASIEST WAY TO SOLVE THE PROBLEM,无需使用第三方框架(也无需花时间学习/编程)。

示例代码:

    protected void Page_Load(object sender, EventArgs e)
    {
        DBConfiguration cachConf;
        cachConf = Cache["cachConf"] as DBConfiguration;
        if (cachConf == null)
        {
            cachConf = new DBConfiguration();

            XmlDocument doc = new XmlDocument();
            doc.Load(HttpContext.Current.Request.PhysicalApplicationPath + "bin/MyConf.xml");
            XmlNodeList xnl = doc.GetElementsByTagName("username");
            XmlElement xe = (XmlElement)xnl[0];
            cachConf.Username = xe.InnerText.ToString();
            xnl = doc.GetElementsByTagName("password");
            xe = (XmlElement)xnl[0];
            cachConf.Password = xe.InnerText.ToString();               

            Cache.Insert("cachConf", cachConf, 
                new System.Web.Caching.CacheDependency(
                    HttpContext.Current.Request.PhysicalApplicationPath + "MyConf.xml"),
                    DateTime.Now.AddMinutes(60), TimeSpan.Zero,
                    System.Web.Caching.CacheItemPriority.Default,
                    new System.Web.Caching.CacheItemRemovedCallback(
                        CacheItemRemovedCallBack));
        }
        LabelUsername.Text = cachConf.Username;
        LabelPassword.Text = cachConf.Password;            
    }

    private void CacheItemRemovedCallBack(string key, object value, CacheItemRemovedReason reason)
    {
        //Response.Write("Hello world"); 
    }

答案 1 :(得分:2)

问题1 - 运行时更改: Microsoft希望您应用于此类问题的解决方案是简单地使Web服务器保持无状态。当ASP.NET应用程序循环使用时,它允许现有请求在新进程上完成新请求。有关背景信息,请参阅IIS Process Recycling。对web.config的更改会回收工作进程,但用户不会注意到这一点(除非您在Web服务器进程中保持状态)。这就是MS的设计。

如果要在不回收进程的情况下监视更改,则需要除默认web.config行为之外的其他内容。想到的一个例子是巡航控制项目文件。它们有一个组件可以将对象映射到xml和从xml映射,使用它可以使用FileSystemWatcher类来监视更改。

问题2 - 自定义配置: 听起来你有来自不同库的组件具有不同的依赖关系。您的主程序集需要一种实例化服务的方法,具有一组给定的依赖项。 MS数据提供商模型很酷,但不是很酷。

要做到这一点,请使用控制容器的反转,因为这正是他们所做的。我喜欢autofac(因为我喜欢Philip K Dick参考),但castle windsor很棒。

现在,如果您正在谈论动态更改数据库或数据提供程序,则可能是配置不正确。如果您要针对y类型的x数据库进行报告,则需要该数据库信息的中央存储库,并且配置文件不是正确的位置,IOC容器也不是正确的解决方案。

答案 2 :(得分:2)

您可以将凭据存储在从web.config引用的辅助配置文件中,如下所示:

<appSettings file="AppSettings.config"/>

您仍需要小心避免编辑外部文件上的冲突。

答案 3 :(得分:0)

如同Precipitous建议的那样,试试Castle Windsor:

http://www.castleproject.org/container/

您正在手动进行控制反转。温莎会减轻你的负担。