如何在64位操作系统的ASP.NET上使用未经管理的ODP.NET(64位)?

6
我需要在64位机器上运行一个使用非托管ODP.NET的遗留应用程序。
以下是步骤:
1.我已经安装了64位的非托管ODP.NET。
2.我已经验证64位非托管ODP.NET可以正常工作,因为我在控制台应用程序中进行了测试。
3.我创建了一个测试Web应用程序,其中包含与工作中的控制台应用程序相同的数据访问代码,并引用了控制台应用程序使用的GAC中的相同Oracle.Data.Access DLL。但是,该Web应用程序无法连接到数据库。代码片段不相关,因为代码可行且非常简单(参见第2点)。
在conn.Open()处失败。
Exception.Message为空。
Exception.StackTrace没有用:
 at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, 
    OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object 
    src, String procedure, Boolean bCheck, Int32 isRecoverable) at 
    Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, 
    OracleConnection conn, IntPtr opsErrCtx, Object src) at 
    Oracle.DataAccess.Client.OracleConnection.Open() at 
    TestODPNet.ODPNetTester.Test() in 
    D:\Projects\TestODPNet\TestODPNet\ODPNetTester.cs:line 27

应用程序正在运行在本地的IIS上,而不是IIS Express。
在IIS中,“启用32位应用程序”设置为false。
该应用程序针对x64位平台,而不是Any CPU。
本地环境下,我使用64位Windows 10,在服务器上,我使用64位Windows Server 2012。我无法使非托管的ODP.NET在两者上正常工作。因此,据我所知,这与32位二进制文件无关,因为ODP.NET和两个操作系统都是64位的。
编辑:应用程序池(临时进行测试)使用与控制台应用程序相同的帐户运行,该帐户是机器上的管理员。
我错过了什么?如何在64位操作系统上使非托管的ODP.NET(64位)在ASP.NET上工作?
注意:这个问题看起来有点类似于其他问题,但据我所知并不是这样。
注意2:是的,我知道推荐的方法是使用托管的ODP.NET,但我没有源代码,因此无法进行更改。

1
非托管的ODP.NET不是一个文件,而是由一整套相关文件和配置/注册项组成的集合。您是如何将Oracle.DataAccess.dll放入机器中的?如果您没有运行安装程序将其放置在那里,建议您运行安装程序进行安装。另外,请告诉我们你使用的版本号。 - Christian Shay
1
你应该专注于获取异常信息,因为这通常会导致解决方案。尝试捕获 OracleException 看看是否有帮助。 - Christian Shay
@ChristianShay 谢谢您的回复。我通过安装程序安装了ODP.NET。我更改了代码以捕获OracleException。异常消息仍为空。内部异常仍为空。数据库版本为11.2.0.4.0 - 64位。ODP.NET版本为2.112.1.0(AMD64)和4.121.1.0(AMD64)。 - Zesty
1
如果您正在运行IIS,则很可能不是在与工作的控制台应用程序相同的身份下运行。您可以尝试在相同的身份下运行:如果这样可以,那么这表明它是由于两个帐户之间的差异(注册表设置、配置文件、权限等)引起的。 - Joe
我假设你已经看过了这个相关的帖子 https://dev59.com/4FjUa4cB1Zd3GeqPNQIn - Seano666
显示剩余3条评论
1个回答

0

我尝试了一个简单的应用程序,对我来说它按预期工作。我的设置是Win 8.1,IIS。

连接到Oracle后,进程加载的DLL的屏幕截图。

enter image description here

    using (OracleConnection conn = new OracleConnection(connectionString))
    {
        conn.Open();
            
    }

基于 ODP.Net 文档

Oracle Data Provider for .NET, Unmanaged Driver Assemblies

Oracle.DataAccess.Client 命名空间包含用于客户端提供程序的 ODP.NET 类和枚举。

我在项目中添加了对 Oracle.DataAccess.dll 的引用。这是我项目中唯一引用的 Oracle DLL。

在我的计算机上,该 DLL 位于以下位置

\product\12.2.0\client_1\odp.net\bin\4\Oracle.DataAccess.dll

我使用了从Oracle网站下载的this版本来安装ODP.Net

enter image description here

在安装过程中,我特别选择了:
(1)不更改machine.config
(2)不在GAC中安装任何内容
因此,可以尝试以下方法:
(1)从Oracle文件夹中引用程序集(而不是GAC)
(2)安装最新可用的ODP.Net
祝好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接