尝试从Windows服务读取IIS站点的web.config文件

时间:2013-04-05 04:23:45

标签: c# asp.net iis service web-config

我正在尝试为本地IIS上安装的网站查找特殊的web.config文件。我从Windows服务进行搜索。我做了以下事情:

using (ServerManager serverManager = new ServerManager())
{
    for (int r = 0; r < serverManager.Sites.Count; r++)
    {
        string strSiteName = serverManager.Sites[r].Name;
        ApplicationCollection arrApps = serverManager.Sites[r].Applications;

        for (int a = 0; a < arrApps.Count; a++)
        {
            Microsoft.Web.Administration.Application aa = arrApps[a];
            foreach (VirtualDirectory vd2 in aa.VirtualDirectories)
            {
                string strPhysPath = Environment.ExpandEnvironmentVariables(vd2.PhysicalPath);
                int rr = 0;

                try
                {
                    Configuration cnfg = serverManager.GetWebConfiguration(strSiteName, strPhysPath);
                    if (cnfg != null)
                    {
                        string swww = getWebConfigGeneralParamValue(cnfg, "SpecNodeName");
                    }
                }
                catch
                {
                    //Error
                }

            }
        }

    }

其中,

public static string getWebConfigGeneralParamValue(Configuration config, string strParamKey)
{
    string strRes = null;

    try
    {
        ConfigurationSection configSection1 = config.GetSection("configuration");
        if (configSection1 != null)
        {
            ConfigurationElement configGeneralParams = configSection1.GetChildElement("GeneralParams");
            if (configGeneralParams != null)
            {
                ConfigurationElementCollection configCol = configSection1.GetCollection();
                if (configCol != null)
                {
                    strRes = configCol[strParamKey].ToString();
                }
            }
        }
    }
    catch(Exception ex)
    {
        strRes = null;
    }

    return strRes;
}

并且此脚本应该识别的web.config文件是这样的:

<?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
 <!-- regular ASP.NET config stuff -->
 <GeneralParams>
  <param key="SpecNodeName" value="Special Node Value"/>
 </GeneralParams>
</configuration>

但我得到的是config.GetSection("configuration");抛出此异常:

  

{“文件名:   \\?\ C:\的Inetpub \ wwwroot的\ C:\用户\开发\桌面\ CSHARP \ MyTestWebApp \ MyTestWebApp \ web.config文件\ r \ n错误:   配置部分'配置'无法读取,因为它是   缺少部分声明\ r \ n \ r \ n“}”

知道如何让它发挥作用吗?

2 个答案:

答案 0 :(得分:0)

您无需定位配置,您需要从需要获取数据的位置定位该特定节点。这是一个例子。

using(ServerManager mgr = ServerManager.OpenRemote("Some-Server")) {

  Configuration config = mgr.GetWebConfiguration("site-name", "/test-application");

  ConfigurationSection appSettingsSection = config.GetSection("appSettings");

  ConfigurationElementCollection appSettingsCollection = appSettingsSection.GetCollection();

  ConfigurationElement addElement = appSettingsCollection.CreateElement("add");
  addElement["key"] = @"NewSetting1";
  addElement["value"] = @"SomeValue";
  appSettingsCollection.Add(addElement);

  serverManager.CommitChanges();
} 

答案 1 :(得分:0)

我感觉,如果你有web.config,为什么要使用ServerManager。 看看下面的代码,我在我的代码中使用它,它作为一个魅力。 它的作用是以可读格式加载web.config。

var assemblyPath = Path.GetDirectoryName(typeof (ConfigurationTests).Assembly.Location);
            string webConfigPath = MyPath;
            string directory = System.IO.Path.GetFullPath(Path.Combine(assemblyPath,webConfigPath));
            Console.WriteLine(directory);
            Assert.That(Directory.Exists(directory));

            VirtualDirectoryMapping vdm = new VirtualDirectoryMapping(directory, true);
            WebConfigurationFileMap wcfm = new WebConfigurationFileMap();
            wcfm.VirtualDirectories.Add("/", vdm);
            System.Configuration.Configuration webConfig = WebConfigurationManager.OpenMappedWebConfiguration(wcfm, "/");

            var connectionString = webConfig.ConnectionStrings.ConnectionStrings["ConnectionString"].ConnectionString;

            Console.WriteLine("Connection String:");
            Console.WriteLine(connectionString);


            Console.WriteLine("AppSettings:");
            foreach (var key in webConfig.AppSettings.Settings.AllKeys)
            {
                Console.WriteLine("{0} : {1}", key, webConfig.AppSettings.Settings[key].Value);
            }