您的位置:首页 > 数据库 > Oracle

解决Windows 2008 Server 64位,.NET访问Oracle问题

2014-04-25 15:12 393 查看
解决Windows 2008 Server 64位,.NET访问Oracle问题

在解决标题问题前,先说下Windows 2008 Server 部署MVC4 API的过程吧,也当方便还在纠结中的小伙伴们,尽量少走弯路。

1. 如果服务器上IIS还没有安装,在角色管理里添加Web服务器(IIS)。【添加角色】功能中完成。网上有直接答案,这里不再赘述。

2. 安装.NET 4.5环境。

3. 确认IIS完成安装后,进入Internet信息服务(IIS)管理器,选择IIS的根目录,在【功能视图】中找到【ISAPI和CGI限制】,取消安装的.NET版本的限制

4. 接下来在发布Web API服务器前,先创建应用 程序池。在创建的时候,注意选择.NET的版本,选择你需要的安装版本

5. 开始部署API应用程序或者网站。注意,笔者就遇到实现默认的80端口被占用的问题,导致默认网站下部署API出现问题,最后单独部署成网站,解决问题。

6. 最后,可以浏览测试了。由于各自的环境不一样,如果遇到HTTP错误,可以根据错误号找到对应的解决办法。

接下来,我们再说说解决.NET应用程序在64位下访问Oracle的问题吧。以下内容来自网上,在这里汇总贴出来,供大家参考。

以下所有的说明都是基于Windows64位的(以Windows2008为例)

1解决方案(这是最终步骤,其他供参考)

1 安装Oracle64位客户端(win64_11gR2_client):

下载页面:

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html

下载地址:

http://download.oracle.com/otn/nt/oracle11g/112010/win64_11gR2_client.zip

已经下载到\\192.168.9.24\常用软件\Oracle\win64_11gR2_client.zip

然后正常安装,并进行数据库连接的配置,比如tnsnames.ora

2 将NetWorkService用户加入Administraotr组中,重启计算机(重要)

3 新建asp.net网站,配置程序的调试模式为使用IIS,不要使用WebServer,这样就可以调试了

4 由于Webserver是32位的程序,因此如果要使用webserver进行调试,可以考虑安装32位的Oracle客户端(没有进行测试)。

注意:对于已经安装了32位Oracle客户端的情况,本次没有测试

2安装顺序

安装Oracle11g Release 2 ODAC 11.2.0.1.2 with Oracle Developer Tools for Visual Studio,配置服务器tnsnames,使用SQLPLUS测试成功连接。

启动IIS,发布.NET连接ORACLE的应用,测试,报"System.Data.OracleClient需要Oracle客户端软件8.1.7或更高版本"错误。解决:将ORACLE安装目录
为NetworkService用户赋读和执行权,并传递到所有子目录。

重启动IIS,报“尝试加载 Oracle客户端库时引发BadImageFormatException。如果在安装32位
Oracle客户端组件的情况下以64位模式运行,将出现此问题。”解决:下
载并解压instantclient_11_2的X64版本,放到ORACLE安装目录下,并在PATH路径中搜索在前。

重启动IIS,报“ORA-12154:TNS:could not resolve the connect identifier specified”错误。解决:指定环境变量TNS_ADMIN到tnsnames.ora所在目录。

重启动IIS,.NET应用连接数据库服务器成功。

3在asp.net中,不用使用Webdev进行调试,必须使用IIS调试

我们平时使用的都是32位的机器进行开发,装的都是32位的软件,但是我们的服务器一般都是64位的,所以有时也需要在64位的环境下装一个VS调试程序。最近
遇到的一个问题就是一个同事换了一个电脑,用的是X64的Windows2008作为操作系统,要进行Oracle的数据库连接,所以也装了64位的Oracle客户端。如果是控制应
用项目或者WinForm项目可以正常连接Oracle,但是Web项目在程序中打开Oracle连接时,系统抛出了异常:

尝试加载 Oracle客户端库时引发BadImageFormatException。如果在安装32位
Oracle客户端组件的情况下以64位模式运行,将出现此问题。

显然,这个提示的不正确,因为我们装的就是64位的客户端,所以并不存在64位程序调用32位客户端的情况。难道是生成的程序是32位的,然后32位调用了64位的
客户端,于是我把程序属性中的生成平台改为X64,如图所示:

结果这样生成的WebService程序在调用时还是报同样的异常。这个问题困扰了我一天,其中想到的解决办法就是把64位的客户端卸载了,在X64的操作系统中安
装32位的客户端,然后这样就可以了,但是如果不是Web应用(比如控制台应用程序或者WinForm程序)却同样报错,那就需要将非Web应用的项目按照上图的设置方
法,将生成的平台改为X86才能正常运行。

解决办法:

这当然是一个折中的办法,今天终于发现了真正的原因,原来VS在建Web项目时,平时运行使用的是自带的WebDev.WebServier是一个32位的服务,所以在其中运
行的Web项目不管怎么设置平台,都只能作为32位的应用来看待,所以在Web项目运行时连接64位的Oracle客户端会报错,而非Web项目就不会。

网上搜了一下,好像WeDev服务好像没有64位的,所以要解决这个问题,那么就不要使用这个服务作为Web服务,而使用IIS,因为IIS使用的是w3wp,在64位的操作系
统中是64位的,所以可以正常使用64位的Oracle客户端。具体设置如下:

这样设置后,每次运行就好以IIS来运行,不管是Web项目还是控制台应用项目或者WinForm项目,都会正常连接Oracle了。

4使用VS开发基于Oracle程序的严重问题

基于Oracle开发时遇到

数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,
将出现此问题

TheProblem in english is :

"Attempt to load Oracle client libraries threw BadImageFormatException.This problem will occur when running in 64 bit mode with the 32 bit Oracleclient components installed"

具体环境是:

win200864

vs 2010

开发调试过程中都没有问题,一部署这个问题就来了。

然后经过一大堆改动,改装64位Client之后的结果是:

IIS测试都没有问题,一调试这个问题就来了。

最奇怪的是这两个错误都是同样的错误信息。

呵呵,两种情况都让我碰到了,那就一起解决了他

我搞了整整两天才解决,网上有是有相关资料,但是都不全。具体原因也不明了.下面我来全面的讲述一下。

VS编译器调试过程用的并不是IIS来发布而是用上面这个进程。我们可以看到,他明显是一个32位的。而IIS
7的进程w3wp是64 bit的。这就说明,如果我们在调
试,那么我们的程序就在模拟32位运行,部署之后,确是模拟64位运行,让我最不能理解的是为什么一个是模拟32位运行,一个是模拟64位运行,而给我们的异常信息
确实相同的呢?先不管这么多,至少现在这里我们可以得出一个结论:

如果你写的程序调试过程没有任何问题,那么你发布到64位IIS时就一定会有问题,反之则得到相反的结果。

解决方法如下:

情况一.调试过程没有任何问题,发布时出现问题

若调试没有任何问题,那么你肯定是使用32 bitoracle client了,而服务器的IIS是64
bit的,所以需要发布网站的话,必须安装64bit client

实际上,System.Data.OracleClient所指向的是PATH环境变量下的oci.dll。因此,我们只要让程序能够找到64位的oci.dll就可以了。方法如下:

1. 下载instantclient-basic-win-x86-64-11.1.0.7.0.zip,并解压,如C:\instantclient-basic-win-x86-64-11.1\instantclient_11_1(这个部分也是必须的,根据实际情况的不
同进行修改)。

2. 在系统的环境变量PATH中加入以上路径。

之后重启操作系统(这个是必须的,我弄了一下午没有搞好,结果重启一下马上就好了),程序会依照PATH路径寻找oci.dll,如果遇到32位的oci.dll会自动略过,找到64位
的oci.dll就能连接上数据库了。

情况二.调试过程出现问题,但是在IIS上测试没有问题

若IIS测试没有任何问题,那么你肯定使用的是64bit oracle client了,调试出错是因为调试的WebDev进程服务器是32bit的,为了模拟真实环境,你需要进行一些设置。

如果是这样的情况,那你就改VS的调试服务器吧,改成IIS就可以了。

到这里,我们可以下结论,Oracle给的异常信息对于第一种情况来说是正确的,对于第二种情况则是错误的,意思刚好相反!!!可能是做本地化人员的一个粗心错误。

解决完这个问题之后,我的custom oracle membership forsharepoint的测试开发也就搞定了。近期还会记录一篇文章讲述customoracle
membership for
sharepoint的开发总结。

5System.Data.OracleClient需要 Oracle客户端软件
8.1.7或更高版本

在用VSTS2005/2008+Oracle9做环境连接Oracle时候,在VS开发服务器运行正常,但IIS服务器调试和部署会报错!

IIS服务器报错:System.Data.OracleClient需要 Oracle客户端软件
8.1.7 或更高版本。

出错的原因:

1.虽然报的是需要安装客户端8.1.7及以上版本,实际是.net账户没有访问Oracle\bin文件夹的权限

2.在Windows Server 2003/2008的NTFS系统中提供了高级的访问安全性,FAT32系统也许没有这个问题。

解决办法如下:

我用Windows Server 2008为例Windows Server 2003是一样的

1.打开安装有Oracle客户端的电脑,在安装目录C:\oracle\ora90\BIN文件夹上右键-》安全选项卡-》点击编辑---》添加。

2.点击“查找范围”,在下面显示的账户中选择“NTWORKSERVICE”
----将“读取和执行”的权限都赋给他(如果不行就把完全控制给他,这样不安全),
子文件夹继承此权限,确定。

3.打开“服务器管理器”-》配置-》本地用户和组-》组-》adminisgrators-》将NetworkService添加进来

4.重新启动IIS,在“运行”中输入“IISRESET”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐