ODP.NET Oracle.ManagedDataAccess导致ORA-12537网络会话结束文件

概观

我想用Orcale替换Oracle.DataAccess。 托管 DataAccess,但打开与后者的连接会引发ORA-12537网络会话文件结束exception。

exception消息/堆栈跟踪

{OracleInternal.Network.NetworkException(0x000030F9): ORA-12537 :在OracleInternal.TTC.OraBufReader.Read中的OracleInternal.TTC.OraBufReader.GetDataFromNetwork()中的OracleInternal.Network.ReaderStream.Read(OraBuf OB)上的Dateiende:Boolean bIgnoreData )OracleInternal.TTC.TTCProtocolNegotiation.ReadResponse()}中的OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)

我正在尝试连接到Oracle 11g数据库,并且我的本地计算机上没有安装客户端。

工作测试应用程序(非托管)

使用Oracle.DataAccess 工作正常

using System; using Oracle.DataAccess.Client; namespace App.Odp.Unmanaged { internal class Program { private static void Main(string[] args) { //dummy connection string. using SID string connectionString = "User Id=***;password=***;Data Source=1.2.3.4:1521/sid01;"; try { using (var conn = new OracleConnection(connectionString)) { conn.Open(); using (OracleCommand cmd = conn.CreateCommand()) { cmd.CommandText = "select * from all_users"; using (OracleDataReader reader = cmd.ExecuteReader()) { Console.WriteLine("VisibleFieldCount: {0}", reader.VisibleFieldCount); Console.WriteLine("HiddenFieldCount: {0}", reader.HiddenFieldCount); } } } } catch (Exception ex) { Console.WriteLine("Error:{0}", ex.Message); } Console.ReadLine(); } } } 

引用和依赖

  • Oracle.DataAccess(2.111.7.0)
  • oci.dll(11.1.0.1)
  • orannzsbb11.dll(11.1.0.6)
  • oraociei11.dll(Oracle Call Interface Instant Client)
  • OraOps11w.dll(2.111.7.0)

项目设置

Plattform目标x86
目标框架4.5

失败的测试应用程序(托管)

使用nuget包官方Oracle ODP.NET,托管驱动程序12.1.21

代码与上面相同。 只改变:

 using System; using Oracle.ManagedDataAccess.Client; //... rest the same as above 

引用和依赖

只要:

  • Oracle.ManagedDataAccess(4.121.2.0)

项目设置

Plattform target 任何CPU
目标框架4.5

App.config中

    
<!----> <!---->

我尝试了不同的设置(NTS,none,all)并将连接字符串更改为User Id = XXX; password = XXX; Data Source = MyDataSource; ,但错误保持不变。

问题

  • 什么可能导致ORA-12537网络会话结束文件exception?
  • 参考/依赖缺失了吗?
  • 是否必须在数据库服务器上配置某些内容?

UPDATE

在服务器上,我们得到一个ORA-12679:本机服务被其他进程禁用但在alert.log中需要出错。

它似乎与加密有关。 在服务器sqlnet.ora中注释掉以下行可以解决问题。

 #SQLNET.AUTHENTICATION_SERVICES=(NTS) #SQLNET.ENCRYPTION_TYPES_SERVER = (rc4_128, rc4_256) #SQLNET.ENCRYPTION_SERVER=REQUIRED #ENCRYPTION_WALLET_LOCATION= # (SOURCE=(METHOD=FILE)(METHOD_DATA= # (DIRECTORY=...\%ORACLE_SID%\wallet))) 

新问题

我们如何配置ManagedDataAccess以便它与加密一起使用?

更新2

似乎现在使用ODP托管驱动程序12c:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/

编辑:现在支持ASO。 升级到ODAC 12c版本4或更高版本。 如果这不能解决您的问题,请检查数据库服务器上的alert.log并调查(谷歌)您尝试连接时出现的任何错误。


原答案:

在撰写本文时(2015年4月30日),不支持使用ODP.NET托管驱动程序进行Oracle Advanced Security Option(ASO)加密,这是造成错误的原因。

这很可能在将来的某个时候得到支持,所以如果你以后再读这个,请查看最新的ODP.NET文档,看看是否需要升级ODP.NET。

http://docs.oracle.com/cd/E56485_01/win.121/e55744/InstallConfig.htm#CHDJIDIG

截至2015年10月5日,Oracle.ManagedDataAccess驱动程序(ODAC 12c Release 4)支持ASO。

https://apex.oracle.com/pls/apex/f?p=18357:39:18138408495219::NO::P39_ID:28201

确保您在GAC中没有旧版本的Oracle.ManagedDataAccess。 似乎dll的几个版本具有相同的AssemblyVersion。

我在CLR 4 GAC(C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSIL)中安装了Oracle 12.1客户端的旧版本。

由于首先使用GAC中的dll:s,因此使用了旧的ASO无法使用的版本,但我认为我使用的是较新的版本。

解决方案是从GAC卸载旧版本。 12.1.2400 Nuget包自述文件中的第一个安装步骤是“Un-GAC并取消配置任何现有的程序集”。

我也很难解决这个错误。 最后,我尝试使用Oracle.ManagedDataAccess.dll for 12c(版本4.122.1.0)。 从ODAC安装目录(\ odp.net \ managed \ common)为上面的dll创建了一个引用,它工作了…… !!! 分享我的解决方案

有一些相同的问题。 在注册表中找到一个条目:HKEY_LOCAL_MACHINE \ SOFTWARE \ wow6432 \ oracle。 如果此部分包含ODP.NET.managed条目,则可以使用另一个密钥(名称版本dependend)检查此entyr是否包含名为TNS_ADMIN的字符串。 应删除此字符串或将值更改为不存在的目录。 如果字符串存在并指向有效目录,则受管客户端不使用配置文件中的设置并失败。 应该使用进一步的调查,但我的工作正常,并且必须推迟其余的……