.net 枚举MS Enterprise Library中的DbProviderFactorys会返回不同的结果

.net 枚举MS Enterprise Library中的DbProviderFactorys会返回不同的结果,.net,odp.net,system.data,enterprise-library-6,.net,Odp.net,System.data,Enterprise Library 6,我有多个应用程序使用MS Enterprise Library和Oracle ODP.Net驱动程序连接到Oracle 一个windows服务应用程序在尝试创建与Oracle DB的连接时引发以下错误: 数据库“MyDBName”的连接字符串不存在或没有有效的提供程序 另一个应用程序,一个web服务,做了完全相同的事情,并且运行良好。两者都在我的计算机上本地运行 在windows服务中,我检查了明显的问题:连接字符串实际上在那里,名称拼写正确,数据库提供程序Oracle.DataAccess.C

我有多个应用程序使用MS Enterprise Library和Oracle ODP.Net驱动程序连接到Oracle

一个windows服务应用程序在尝试创建与Oracle DB的连接时引发以下错误:

数据库“MyDBName”的连接字符串不存在或没有有效的提供程序

另一个应用程序,一个web服务,做了完全相同的事情,并且运行良好。两者都在我的计算机上本地运行

在windows服务中,我检查了明显的问题:连接字符串实际上在那里,名称拼写正确,数据库提供程序Oracle.DataAccess.Client在那里并且拼写正确。我还确认在machine.config中正确安装和配置了ODP.net(这必须是因为web服务可以工作)。web和win服务都使用.NET4.5.1。所以我相信所有显而易见的事情都被排除在外了

进入ent lib代码时,我发现异常源是因为在windows服务下调用此方法时返回false:

private static bool IsValidProviderName(string providerName)
{
    return DbProviderFactories.GetFactoryClasses().Rows.Find(providerName) != null;
}
在web服务下运行时,返回true。在这两种情况下,提供的providerName的值相同(Oracle.DataAccess.Client)。然后,我查看了GetFactoryClasses()返回的行,并意识到在windows服务下,只有少数(大约一半)注册的工厂类从machine.config返回,Oracle类不在其中。这就是它失败的原因。为了使其正常工作,我在app.config中为我的服务添加了以下内容:

<DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client"/>
      <remove invariant="Oracle.DataAccess.Client"/>

      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
      <add name="ODP.NET, Unmanaged Driver" invariant="Oracle.DataAccess.Client" description="Oracle Data Provider for .NET, Unmanaged Driver" type="Oracle.DataAccess.Client.OracleClientFactory, Oracle.DataAccess, Version=4.121.1.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />

    </DbProviderFactories>

这些是直接从machine.config中复制的

因此,我的问题基本上是,在枚举已注册的DbProviderFactorys时,为什么在同一版本的.net下运行的两个应用程序不能产生一致的结果