24

我有一个控制台 capplication,它在托管一堆 web.config 文件的同一台计算机上运行。我需要控制台应用程序打开每个 web.config 文件并解密连接字符串,然后测试连接字符串是否有效。

我遇到的问题是 OpenExeConfiguration 需要一个 winforms 应用程序配置文件 (app.dll.config) 并且 OpenWebConfiguration 需要通过 IIS 运行。因为这是我的本地机器,所以我没有运行 IIS(我使用 Visual Studio 的内置服务器)。

有没有一种方法可以打开 web.config 文件,同时仍然获得 .NET 解密连接字符串的功能的稳健性?

谢谢

更新 如果您直接查询 IIS 或者是您要查找 web.config 的相关网站,则 OpenWebConfiguration 有效。我想要完成的是相同类型的功能,但是从控制台应用程序打开我的同一台机器上的网站的 web.config 文件,而不使用 IIS 查询,因为 IIS 没有在我的机器上运行。

4

4 回答 4

38

好的,我明白了...编译并访问了它,所以我知道它可以工作...

      VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(@"C:\test", true);
            WebConfigurationFileMap wcfm = new WebConfigurationFileMap();
            wcfm.VirtualDirectories.Add("/", vdm);


            // Get the Web application configuration object.
            Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");

            ProtectSection(config, @"connectionStrings", "DataProtectionConfigurationProvider");

这是假设您在名为 C:\Test 的目录中有一个名为 web.config 的文件。

我调整了@Dillie-O 的方法以将配置作为参数。

您还必须引用 System.Web 和 System.configuration 以及包含在 web.config 中设置的配置处理程序的任何 dll。

于 2009-02-05T15:48:17.697 回答
3

当 ConfigurationManager 类从配置文件中抓取一个部分时,它具有一个“IsProtected”属性,它可以为您抓取的给定部分推断出该属性。如果它受到保护,您可以使用一些代码取消保护它。

加密/解密的基本方法是这样的(取自下面的文章链接):

private void ProtectSection(string sectionName, string provider)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
                 config.GetSection(sectionName);

    if (section != null &&
              !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(provider);
        config.Save();
    }
}

private void UnProtectSection(string sectionName)
{
    Configuration config =
        WebConfigurationManager.
            OpenWebConfiguration(Request.ApplicationPath);

    ConfigurationSection section =
              config.GetSection(sectionName);

    if (section != null &&
          section.SectionInformation.IsProtected)
    {
        section.SectionInformation.UnprotectSection();
        config.Save();
    }
}

查看这篇文章以获取有关使用此功能的完整详细信息。

于 2009-02-04T21:52:34.297 回答
1
    public static string WebKey(string key)
    {

        var configFile = new System.IO.FileInfo(webconfigPath);
        var vdm = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
        var wcfm = new WebConfigurationFileMap();
        wcfm.VirtualDirectories.Add("/", vdm);
        System.Configuration.Configuration config = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");
        System.Configuration.AppSettingsSection appSettingSection = (System.Configuration.AppSettingsSection)config.GetSection("appSettings");
        System.Configuration.KeyValueConfigurationElement kv = appSettingSection.Settings.AllKeys
                         .Where(x => x.Equals(key))
                         .Select(x => appSettingSection.Settings[key])
                         .FirstOrDefault();

        return kv != null ? kv.Value : string.Empty;

    }
于 2018-03-06T21:42:57.913 回答
0

我认为您想使用 WebConfigurationManager 类及其OpenWebConfiguration方法。

它需要一个指向 web.config 的路径,并且应该像在基于 HTTPContext 的应用程序中一样打开它。

于 2009-02-04T22:54:23.737 回答