c# - 如何以编程方式配置 IIS 中安装的网站的 web.config?

标签 c# asp.net-mvc iis

我开发了一个安装程序,它将向 IIS 7.5 添加一个新网站。 创建网站后,我想配置其连接字符串。安装后如下所示:

<connectionStrings>
    <add name="DefaultConnection" connectionString="$(ReplacableToken_DefaultConnection-Web.config Connection String_0)" providerName="System.Data.SqlClient" />
    <add name="WebContext" connectionString="$(ReplacableToken_WebContext-Web.config Connection String_0)" providerName="System.Data.SqlClient" />
    <add name="ActivityContext" connectionString="$(ReplacableToken_ActivityContext-Web.config Connection String_0)" providerName="System.Data.SqlClient" />
</connectionStrings>

我想使用 C# 配置它们中的每一个。这是我尝试过的:

 using (ServerManager manager = new ServerManager())
     {

         Configuration webConfig = manager.GetWebConfiguration(myWebsite.name);

         ConfigurationSection directoryBrowseSection = webConfig.GetSection("connectionStrings");


         directoryBrowseSection.SetAttributeValue("DefaultConnection", ".\\SQLEXPRESS;Database=_usr;Integrated Security=true");
         directoryBrowseSection.SetAttributeValue("WebContext", ".\\SQLEXPRESS;Database=_main;Integrated Security=true");
         directoryBrowseSection.SetAttributeValue("ActivityContext", ".\\SQLEXPRESS;Database=_activity;Integrated Security=true");
         manager.CommitChanges();

      } 

我得到了什么: 异常详细信息:System.Runtime.InteropServices.COMException:索引无效。 (HRESULT 异常:0x80070585)。

异常出现在以下行:

directoryBrowseSection.SetAttributeValue("DefaultConnection", ".\\SQLEXPRESS;Database=_usr;Integrated Security=true");

我的问题(如果还不清楚)是如何使用 Microsoft.web.administration 在 IIS 上安装的网站上配置连接字符串?

最佳答案

我知道这篇文章有点旧,但我在寻找类似的东西时发现了它。这是我想到的:

//using Microsoft.Web.Administration;
var file = "PATH TO FILE";
var configFile = new FileInfo(file);

var virtualDirectoryMapping = new VirtualDirectoryMapping(configFile.DirectoryName, true, configFile.Name);
var webConfigFileMap = new WebConfigurationFileMap();

webConfigFileMap.VirtualDirectories.Add("/", virtualDirectoryMapping);

var webConfig = System.Web.Configuration.WebConfigurationManager.OpenMappedWebConfiguration(webConfigFileMap, "/");

webConfig.ConnectionStrings.ConnectionStrings.Add(new System.Configuration.ConnectionStringSettings("NAME", "CONNECTION STRING"));
webConfig.Save();

如果这些可以帮助需要使用 .NET 配置文件执行任何操作的其他人(获取配置、提取 appSettings 或 ConnectionString 部分):

using System.Configuration;
using System.IO;
using System.Web.Configuration;

namespace YourNamespace
{
    public static class DotNetConfigFile
    {
        public static Configuration GetConfiguration(string filePath)
        {
            if (File.Exists(filePath))
            {
                FileInfo file = new FileInfo(filePath);
                if (file.Name.ToLower() != "web.config")
                {
                    try
                    {
                        ExeConfigurationFileMap map = new ExeConfigurationFileMap() { ExeConfigFilename = filePath };
                        return ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
                    }
                    catch (ConfigurationErrorsException ex)
                    {
                        return null;
                        //throw;
                    }
                }
                else
                {
                    try
                    {
                        var virtualDirectoryMapping = new VirtualDirectoryMapping(file.DirectoryName, true, file.Name);
                        var webConfigFileMap = new     WebConfigurationFileMap();
                        webConfigFileMap.VirtualDirectories.Add("/",     virtualDirectoryMapping);
                        return WebConfigurationManager.OpenMappedWebConfiguration(webConfigFileMap, "/");
                    }
                    catch(ConfigurationErrorsException ex)
                    {
                        return null;
                        //throw;
                    }
                }
            }
            else
                throw new FileNotFoundException("File not found", filePath);
        }

        public static KeyValueConfigurationCollection GetAppSettings(string filePath)
        {
            var config = GetConfiguration(filePath);
            if (config != null)
                return config.AppSettings.Settings;
            else
                return null;
        }

        public static KeyValueConfigurationCollection GetAppSettings(FileInfo fileInfo)
        {
            return GetAppSettings(fileInfo.FullName);
        }

        public static ConnectionStringSettingsCollection GetConnectionStrings(string filePath)
        {
            var config = GetConfiguration(filePath);
            if (config != null)
                return config.ConnectionStrings.ConnectionStrings;
            else
                return null;
        }

    public static ConnectionStringSettingsCollection GetConnectionStrings(FileInfo fileInfo)
    {
        return GetConnectionStrings(fileInfo.FullName);
    }
}

关于c# - 如何以编程方式配置 IIS 中安装的网站的 web.config?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25124298/

相关文章:

c# - 调用并从服务中获取结果文本

c# - Mvc 创建按钮弹出需要帮助 C#.net

asp.net - 将 PUT、DELETE 动词添加到 IIS 中的 .aspx 扩展有什么问题吗?

iis - 如何让浏览器信任用于测试的自签名证书?网站地址与完全限定域名略有不同

c# - 从 c# .net 应用程序中的 ihttpmodule 检测映射的虚拟目录

c# - C# 的类 Ruby 'unless'?

c# - 异步asyncawait方法生成pdf

c# - Taglib-Sharp 大文件(64 位文件)支持

c# - 基本登录 Controller

asp.net-mvc - 在 ASP.NET MVC 测试项目中模拟静态方法