获取web.config以指定与已安装版本不同的ODP.net版本

时间:2014-01-15 03:29:50

标签: c# asp.net odp.net

我的web.config文件中有以下内容

    <DbProviderFactories>
      <remove invariant ="Oracle.DataAccess.Client" />
      <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>

我的开发机器正在使用OPD.net版本4.121.1.0,我已经添加了对该文件的引用并指定它应该在本地复制。我的部署服务器有一个更旧的客户端10.2.0.100并驻留在D:\ oracle \ product \ 10.2.0 \ db_1 \ BIN中。由于此应用程序将部署到多个服务器配置,因此我不想管理每个服务器的Oracle客户端。我想通过添加

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

我会删除与其他版本的任何冲突,除非我得到......

The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception

阅读之后,似乎可以在我的web.config中使用上面的行,并指定我想使用哪个版本的ODP.net,但它对我不起作用。我正在寻找可能的,这是正确的做法吗?

谢谢。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我不熟悉ODP.net或Oracle。我想你最后引用的是一个dll或一堆dll文件。问题是您的代码从错误的位置获取引用,并且您希望显式指定它。我以前和其他dll一起做过。这是dll通过安装程序在GAC导入时的常见情况,并且由visual studio自动找到它们。

您没有描述Visual Studio解决方案结构,但我认为问题出在您的参考上。如果您的引用是正确的,则不必覆盖任何web.config设置。我会有这样的结构:

solution folder
        ------> lib
        ------> project1
        ------> project2

其中lib文件夹将包含我不在.NET核心中的所有dll。然后,我将删除并添加所有项目引用以查看特定文件夹dll。 This post可以为您提供有关如何使用显式路径设置引用的详细信息(在我的示例中为lib文件夹)。

希望我帮忙!

答案 1 :(得分:1)

“非托管”提供程序由两部分组成:托管驱动程序 - Oracle.DataAccess.dll和非托管客户端(通常称为“Oracle Home”)。虽然我猜可能会有一些不匹配,但你要求11g驱动程序与10g客户端通信,我不认为10g甚至支持.net 4.0(这是你正在加载的驱动程序)。如果要使用.net 4.0和非托管提供程序,则可能别无选择,只能更新服务器。

也就是说,如果服务器依赖是一个问题,我只会使用managed provider。这个无人管理的提供商是托管的.net程序集的大杂烩,它们位于几十年前的无人攻击的dll(Oracle客户端)之上。托管服务提供商是全新的,从头开始的界面,最终放弃了对客户端的旧依赖,真正让你只需要几个dll并运行。