1

我正在开发一个典型的 .net Web 应用程序,它首先部署在测试环境 - ENV-T,然后在完成测试后将其移动到生产环境 - P。我们的托管服务提供商不会直接在 Prod 上部署任何东西,而是首先部署它在测试上,然后他们将其同步到 PROD。

这两个环境Env-T和Env-P也是完全不同的。所以 Web.Config 设置也不同。

因此,要在 ENV-P 上部署任何内容,我们必须按照 Env-P 更改 ENV-T 的 web.config。然后要求托管供应商同步应用程序,然后我们必须恢复。

为了解决这个问题,我想使 Web.config 环境独立。所以我写了一个自定义的 ConfiguraitonManager 类,它将识别应用程序工作的当前环境并相应地加载值。

高级方法: 我们将有两个 Web.config 一个在 ENV-T 文件夹中,另一个在 ENV-P 文件夹中。根据机器名称,我们将识别环境。如果是 ENV-T,则从 ENV-T 文件夹加载 Web.Config 值,如果是 ENV-P,则从 ENV-P 文件夹加载值。

这是我的课:

public static class ConfigurationManager
{
    static Configuration _config;
    static NameValueCollection nameValueColl;
    public static NameValueCollection AppSettings
    {
        get
        {

if (nameValueColl == null)
            {
                if (_config == null)
                    _config = LoadConfig();
                nameValueColl = new NameValueCollection();
                foreach (KeyValueConfigurationElement configElement in _config.AppSettings.Settings)
                {
                    nameValueColl.Add(configElement.Key, configElement.Value);

                }

            }
            return nameValueColl;
        }
    }

    private static Configuration LoadConfig()
    {
        string basePath = string.Empty;


        if (System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath != null)
        {
            basePath = System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath;
        }

        string machineName = System.Environment.MachineName;

        if (machineName.Equals("MachineA"))
        {
            _config = WebConfigurationManager.OpenWebConfiguration(basePath + "Test");
        }
        else if (machineName.ToLower().Equals("MachineB"))
        {
            _config = WebConfigurationManager.OpenWebConfiguration(basePath + "Prod");
        }


        return _config;
    }

}

现在我要做的就是写

ConfigurationManager.AppSettings["KEY1"]

读取 Appsetting 键“KEY1”,我得到了该特定环境的正确值。

问: 我有钥匙 <add key="NoOfRecords" value="50"/>

由于某种原因,在几次点击后(在一两天内),我得到的 NoOfRecords 键值是 50,50,50,50,50 而不是 50。可能的原因:如果我添加一个键,值说“NoOfRecords”, 50" 到已经具有 "NoOfRecords","50" 的 NameValueCollection 对象,它将将该值存储为 "NoOfRecords","50,50"。

但是这又是怎么可能的,因为就在这个代码块之前,我正在创建一个新对象,并且我对此 nameValueColl 变量进行了空检查。

4

0 回答 0