使用Oracle.DataAccess的Web服务器部署会导致各种程序集错误。

3

我的开发机器是Vista x64。

我正在使用WCF web服务构建与Oracle 10g数据库接口的web服务。

当开发开始时,由于在32位的Oracle.DataAccess.dll上出现System.BadImageFormatException异常,我无法使用VS2008内置的WCF测试工具[WCFTestClient],该工具会在按下F5 [Go]时启动。因此,在我的开发环境中,我切换到了ODP.NET 64位版本作为我的引用程序集,这非常好用。

我可以部署到我的本地IIS [7],但只能使用32位的Oracle.DataAccess.dll。

我正在尝试部署到一个安装了.NET 3.5 sp1和Oracle 10g数据库的Win2003 [IIS 6]上。该服务器上的其他Web应用程序成功使用Oracle连接。

如果我从web.config文件中删除所有对Oracle.DataAccess的引用,并确保我的bin/文件夹中没有Oracle.DataAccess.dll,则可以打开默认的服务元数据页面,但通过SOAP客户端调用服务会导致错误:

"Could not load file or assembly 'Oracle.DataAccess, Version=10.2.0.100, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. The system cannot find the file specified."

但是,如果我将Oracle.DataAccess.dll的副本放入我的bin/文件夹中,则会收到以下错误提示:

"Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)"

在尝试在Web浏览器中加载.svc页面时。

如果我在web.config中添加一个程序集引用,我会收到配置错误:"Could not load file or assembly xxx"

我想寻求帮助理解程序集缓存,并寻求有ODP.net经验的人帮助我在这个棘手的领域中导航,以成功部署此服务。

3个回答

9
最近我遇到了类似的问题,发现System.BadImageFormatException是由于在指定目标平台为Any/x64的项目中引用32位版本的Oracle.DataAccess所致。将项目设置为x86并配置IIS 7以启用32位应用程序(右键单击应用程序池->高级设置...将“启用32位应用程序”设置为true)后,一切似乎都按预期工作了。此外,这里有一篇文章介绍如何在不同的工作进程上运行32位和64位版本,另外这里还有一篇说明如何使用IIS 6让32位应用程序在64位上运行的文章。

2
好的,我已经成功[部分]解决了问题,但我仍然需要知道为什么会导致错误。
我在本地机器上安装了ODP.NET 32位版本,并将其安装在与64位版本不同的文件夹中。我在VS项目中更改了程序集引用,指向odp.net/bin/2.x/文件夹中的Oracle.DataAccess.dll。
现在SOAP消息不再抛出错误。
现在的问题是:为什么我的开发环境中dll的选择会驱动必须在生产环境中使用的dll?我希望能够在64位上进行开发,并在32位服务器上部署而无需每次都更改引用。

1

我们公司也遇到了同样的问题,由于没有更好的解决方案,我们只能使用32位dll。

据我们所知,Oracle的64位dll只针对64位系统构建。与“任意”构建的dll不同,它不包括32位对象代码。这本来没什么问题,但是如果项目不是专门为32位构建,则似乎无法加载32位dll。

我们已经尝试了数十个64/32位dll和项目设置的组合,但除了32位dll/ 32位项目外,完全找不到其他能工作的组合。最终,我们不得不推进项目,并停止花费时间在看似无休止的挣扎上。

我真诚地建议,如果可能的话,请评估替代数据库解决方案。我的Oracle经验非常痛苦。

否则,只需使用32位构建即可,这不应该引起任何问题。


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