【问题标题】:Running Oracle on Windows 2008 R2 64-bits and WCF在 Windows 2008 R2 64 位和 WCF 上运行 Oracle
【发布时间】:2011-08-19 07:23:48
【问题描述】:

我正在尝试将连接到 Oracle 10gR2 数据库的 WCF 4.0 服务部署到运行 AppFabric 的 Windows 2008 R2 64 位服务器。在我的 Windows 7 64 位系统上,在 Visual Studio 2010 中,一切顺利。 我首先开始使用 Oracle ODP.NET,在部署时,我开始获得:

System.IO.FileNotFoundException: Could not load file or assembly 'Oracle.DataAccess, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified.
File name: 'Oracle.DataAccess, Version=2.112.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342'

我尝试了很多东西,但似乎没有任何效果,因为我很想让这个工作,所以去了 OracleClient,尽管它被标记为已弃用,只是为了让它工作,然后买我时间。我删除了我已安装的所有内容,但只安装了带有运行时选项的 win64_11gR2_client.zip。但是,比我开始得到的:

System.DllNotFoundException: Unable to load DLL 'oramts.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)

所以我重新安装了 win64_11gR2_client.zip,添加了 Oracle Services for Microsoft Transaction Server 组件。但是,每当我调用我的 WCF 服务时,IIS 都会崩溃并出现以下错误:

Faulting application name: w3wp.exe, version: 7.5.7601.17514, time stamp: 0x4ce7afa2
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7c8f9
Exception code: 0xc0000374
Fault offset: 0x00000000000c40f2
Faulting process id: 0xb28
Faulting application start time: 0x01cc0b141a857fac
Faulting application path: c:\windows\system32\inetsrv\w3wp.exe
Faulting module path: C:\Windows\SYSTEM32\ntdll.dll
Report Id: 7630c4b0-7707-11e0-8419-00155d010609

如果我尝试更改 AppPool 以启用 32 位应用程序,WSDL 甚至不会生成,我会得到:

A process serving application pool 'MyAppPool' suffered a fatal communication error with the Windows Process Activation Service. The process id was '2856'. The data field contains the error number.

我迷路了,我不知道该怎么办。做一个“简单”和典型的 Oracle 设置怎么会这么难?我会尝试解决什么问题?有谁知道博客文章会显示如何正确设置它?我试着寻找,但找不到任何东西,而且我确定我不是唯一遇到此问题的人
好吧,任何帮助将不胜感激。太感谢了

编辑

我回来尝试使用 ODP.NET,因为尝试使用 Microsoft 的 OracleClient 时出现的所有问题。我在我的开发机器上安装了 OPD.NET2 64 位,在项目的参考上,我删除了 32 位参考,并手动参考了 64 位 Oracle.DataAccess.dll。每当我这样做时,我都无法在我的开发机器上使用该解决方案,因为我收到错误:

Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.BadImageFormatException: Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format

这可能是因为它尝试加载 32 位 ODAC,而不是 64 位 ODAC。但是,在我部署到我的 64 位服务器后,我停止收到 FileNotFoundException,但我开始收到:

System.TypeInitializationException: The type initializer for 'Oracle.DataAccess.Client.OracleConnection' threw an exception. ---> Oracle.DataAccess.Client.OracleException: The provider is not compatible with the version of Oracle client
   at Oracle.DataAccess.Client.OracleInit.Initialize()
   at Oracle.DataAccess.Client.OracleConnection..cctor()
   --- End of inner exception stack trace ---

【问题讨论】:

    标签: wcf oracle iis-7 64-bit windows-server-2008


    【解决方案1】:

    我删除了 32 位引用,并且 手动引用 64 位 Oracle.DataAccess.dll。每当我这样做 这个,我无法使用解决方案 在我的开发机器上,因为我得到了 错误:

    Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format.
    
    Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
    
    Exception Details: System.BadImageFormatException: Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. An attempt was made to load a program with an incorrect format
    

    我的开发机器上遇到了同样的问题。我在 IIS 上检查了应用程序池的设置,结果发现 “启用 32 位应用程序” 选项已设置为“True”。我只在 64 位应用程序上工作,所以我可以安全地将此选项设置为其默认值:“False”。之后一切对我来说都很好。

    您可以在 IIS 7 管理器中更改此设置。右键单击应用程序池并选择“高级设置...”。它在“(常规)”组中。

    【讨论】:

    • 这样的问题是,如果在 AppFabric 中使用了 IIS/WAS(如 net.tcp 绑定),却得到一个丑陋的错误,导致整个应用程序池崩溃,所以它不起作用.如果我只使用 HTTP,这可以正常工作。
    • 感谢您提供有关“启用 32 位应用程序”的提示。由于某些未知原因,该位被设置为 false,因此当使用 32 位 Oracle 库在我的 64 位开发盒上运行我的项目时,我得到了BadImageFormatException
    【解决方案2】:

    好的,我能够使用 Oracle ODP.Net 让它工作。只需采取以下步骤:

    • 在 Dev 机器上,安装 Oracle 最新的 ODAC 64bits XCOPY,使用类似 install.bat all c:\oracle\64 oracle_home 的东西
    • 在 Visual Studio 2010 的“引用”中,删除默认的 Oracle.DataAccess 引用,因为它是 32 位的。去浏览,在ODAC的64位安装里面,你会找到\odp.net\bin\2.x\Oracle.DataAccess.dll。参考这个
    • 重建您的解决方案
    • 由于我使用的是 WCF/IIS/AppFabric,因此我选择了构建部署包
    • 在 W2k8 R2 64 位上,安装开发机器上使用的相同 Oracle ODAC 64 位 ODAC
    • 重置 IIS
    • 为避免 TNS 问题,由于不会安装完整的客户端,请使用连接字符串:

      数据源=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=SERVERHOSTNAME)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCLSID)));User Id=user;Password=blablabla;

    • 像往常一样在 IIS/AppFabric 上安装部署包。

    • 应该没问题

    感谢@rlee923 为您提供帮助!

    【讨论】:

      【解决方案3】:

      你是否下载并安装了 64 位版本的客户端?

      dataaccess oracle dll 文件好像是 32 位的。

      如果您还没有,我不确定使用 R2 安装 64 位版本的客户端是否仍然存在问题,但您可能需要修改安装程序的 xml 文件才能正常工作。

      【讨论】:

      • 我在服务器上安装了64位版本。有什么地方清楚地解释我需要做什么来解决这个问题吗?
      • 您是否获取了 oracle.dataaccess.dll 文件并将此引用添加到您的解决方案/项目中?
      • 原谅无知,但哪个版本? 32 还是 64? v2 还是 v4?我假设我在 Windows 7 上安装的那个是 32 位的,对吧?如果我需要引用 64 位,我必须安装它吗?这不会搞砸我当前的配置吗?
      • 我确信 win2k8 r2 只有 64 位。如果您使用的是win7,请按winkey + break进行检查。
      • 不管是v2还是v4,只要是64位就行。如果您不确定使用最新的。是的,你必须安装它。
      猜你喜欢
      • 2011-03-30
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2014-11-25
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多