如何在asp-classic网页调用的.Net COM对象中编辑ConfigurationManager.App/ConnectionSettings

时间:2011-10-28 11:47:06

标签: c# com asp-classic app-config config

我正在实例化.NET COM对象,并希望更新 ConfigurationManager.AppSettings ConfigurationManager.ConnectionStrings 属性。 我注意到即使我在程序集配置文件中有设置,例如“ComLib.dll.config”这些设置在运行时不可用。

我打电话使用以下内容从ASP Classic网页创建COM对象:

Dim COMObject
Set COMObject = Server.CreateObject("COMAPI.COMObject")

我使用我的VS2010调试器进入我的.NET COM对象(COMAPI.COMObject)的构造函数。我要检查 ConfigurationManager 以检查加载的内容。

“Assembly.GetExecutingAssembly”“Assembly.GetCallingAssembly”具有相同的结果,即“ComLib.dll”的完整路径汇编注册地点。这是我的期望。此位置还包含“ComLib.dll.config”文件,该文件未进入 ConfigurationManager

当我尝试使用以下命令清除 AppSettings 时,会发生异常:

ConfigurationManager.AppSettings.Clear();

例外是:“服务器对象:006~ASP 0177~Server.CreateObject失败~80131902”

我的想法是,上面的例外是ASP Classic对“AppSettings是只读的”的解释,但我不是百分百肯定。

我要移动的是加载“ComLib.dll.config”文件,然后运行每个 AppSettings 项目,将它们添加到 ConfigurationManager .AppSettings 设置但也会导致异常:“服务器对象:006~ASP 0177~Server.CreateObject失败~80131902”

我在.NET COM对象中使用的代码如下:

Assembly comApiAssembly = Assembly.GetExecutingAssembly();
string comApiLocation = comApiAssembly.Location;
configuration = null;
configuration = ConfigurationManager.OpenExeConfiguration(comApiLocation);
var toLoadEnumberable = configuration.AppSettings.Settings.GetEnumerator();
while (toLoadEnumberable.MoveNext())
{
    var current = (KeyValueConfigurationElement)toLoadEnumberable.Current;
    ConfigurationManager.AppSettings.Add(current.Key, current.Value);
}

我需要 ConfigurationManager 中的配置信息,因为此.NET COM LIB用于调用其他.NET程序集。其他.NET程序集需要配置。

提前谢谢。

1 个答案:

答案 0 :(得分:2)

我能够得到一些help from the MSDN forums

基本上不是在ConfigurationManager.AppSettings上使用.Clear / .Add / .Remove而是访问一个设置,如果它存在与否,并为该键设置一个值:

ConfigurationManager.AppSettings["Key"] = "KeyValue";

这会更新ConfigurationManager.AppSettings。这很好,因为当我访问我的应用程序的部分超出了最初的“ASP Classic” - > “COM API”调用我仍然可以从ConfigurationManager获取应用程序设置。

说完这些,我仍然不知道如何编辑ConfigurationManager.ConnectionStrings。

如果我在 ConnectionStrings 上尝试。清除 / 。添加 / 。删除,则会发生异常即可。关于这个问题的任何想法?

如果我找到更多信息,我会更新此答案。

作为更新:为了解决没有设置的ConnectionString设置,我实现了Unity Container IoC框架。我使用静态实例来托管IoC容器并以这种方式解析我的实例。

通过这样做我可以在COM API上注册我的接口类类,这意味着我可以通过构造函数注入传递连接字符串设置,我希望解析实例,因为连接字符串设置在范围内。