ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话文件结束
ODP.NET Oracle.ManagedDataAccess causes ORA-12537 network session end of file
概述
我想用 Orcale.ManagedDataAccess 替换 Oracle.DataAccess,但是打开与后者的连接会引发 ORA-12537 网络会话结束文件异常。
异常消息/堆栈跟踪
{OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Netzwerksession: Dateiende
at OracleInternal.Network.ReaderStream.Read(OraBuf OB)
at OracleInternal.TTC.OraBufReader.GetDataFromNetwork()
at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData)
at OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData)
at OracleInternal.TTC.TTCProtocolNegotiation.ReadResponse()}
我正在尝试连接到 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 调用接口即时客户端)
- OraOps11w.dll (2.111.7.0)
项目设置
平台目标x86
目标框架 4.5
失败的测试应用程序(托管)
使用 nuget 包 Official Oracle ODP.NET, Managed Driver
12.1.21
代码与上面相同。仅变化:
using System;
using Oracle.ManagedDataAccess.Client;
//... rest the same as above
引用和依赖关系
仅:
- Oracle.ManagedDataAccess (4.121.2.0)
项目设置
平台目标任何CPU
目标框架 4.5
App.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<publisherPolicy apply="no" />
<assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
<bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<!--<dataSource alias="MyDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=1.2.3.4)(PORT=1521))(CONNECT_DATA=(SID=sid01)))" />-->
</dataSources>
<settings>
<!--<setting name="SQLNET.AUTHENTICATION_SERVICES" value="NTS"/>-->
</settings>
</version>
</oracle.manageddataaccess.client>
</configuration>
我尝试了不同的设置(NTS、none、全部)并将连接字符串更改为 User Id=XXX;password=XXX;Data Source=MyDataSource;,但错误保持不变。
问题
- 什么可能导致 ORA-12537 网络会话文件结束 异常?
- 是否缺少引用/依赖项?
- 是否需要在数据库服务器上进行配置?
更新
在服务器上,我们在 alert.log.
中收到 ORA-12679:本机服务被其他进程禁用但需要 错误
好像跟加密有关系。注释掉服务器中的以下行 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 Managed Driver 12c:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
编辑:现在支持 ASO。升级到 ODAC 12c 第 4 版或更高版本。如果这不能解决您的问题,请检查数据库服务器上的 alert.log 并调查 (google) 尝试连接时出现的任何错误。
原答案:
截至撰写本文时(2015 年 4 月 30 日),不支持使用 ODP.NET 托管驱动程序进行 Oracle 高级安全选项 (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 客户端。
由于 dll:s 在 GAC 中总是首先使用不支持 ASO 的旧版本,但我认为我使用的是较新的版本。
解决方案是从 GAC 中卸载旧版本。
12.1.2400 Nuget 包自述文件中的第一个安装步骤是 "Un-GAC and unconfigure any existing assembly".
我也为这个错误而苦恼。
最后我尝试使用 Oracle.ManagedDataAccess.dll for 12c(版本 4.122.1.0)。从 ODAC 安装目录 (\odp.net\managed\common) 为上述 dll 创建了一个引用,它工作了...!!!分享我的解决方案。
有一些相同的问题。在注册表中找到一个条目:
HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\oracle。
如果此部分包含一个 ODP.NET.managed 条目,则可以使用另一个键(名称版本依赖)检查此条目是否包含一个名为 TNS_ADMIN 的字符串。应删除此字符串或将值更改为不存在的目录。如果该字符串存在并指向有效目录,Managed Client 不会使用配置文件中的设置并失败。
应该使用进一步的调查,但我的东西工作了,必须推迟休息....
我得到了这个错误,这是一个简单的例子,我的查询 运行 有一个错误。
概述
我想用 Orcale.ManagedDataAccess 替换 Oracle.DataAccess,但是打开与后者的连接会引发 ORA-12537 网络会话结束文件异常。
异常消息/堆栈跟踪
{OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Netzwerksession: Dateiende at OracleInternal.Network.ReaderStream.Read(OraBuf OB) at OracleInternal.TTC.OraBufReader.GetDataFromNetwork() at OracleInternal.TTC.OraBufReader.Read(Boolean bIgnoreData) at OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(Boolean bIgnoreData) at OracleInternal.TTC.TTCProtocolNegotiation.ReadResponse()}
我正在尝试连接到 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 调用接口即时客户端)
- OraOps11w.dll (2.111.7.0)
项目设置
平台目标x86
目标框架 4.5
失败的测试应用程序(托管)
使用 nuget 包 Official Oracle ODP.NET, Managed Driver 12.1.21
代码与上面相同。仅变化:
using System;
using Oracle.ManagedDataAccess.Client;
//... rest the same as above
引用和依赖关系
仅:
- Oracle.ManagedDataAccess (4.121.2.0)
项目设置
平台目标任何CPU
目标框架 4.5
App.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.data>
<DbProviderFactories>
<remove invariant="Oracle.ManagedDataAccess.Client" />
<add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
</DbProviderFactories>
</system.data>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<publisherPolicy apply="no" />
<assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
<bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<oracle.manageddataaccess.client>
<version number="*">
<dataSources>
<!--<dataSource alias="MyDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=1.2.3.4)(PORT=1521))(CONNECT_DATA=(SID=sid01)))" />-->
</dataSources>
<settings>
<!--<setting name="SQLNET.AUTHENTICATION_SERVICES" value="NTS"/>-->
</settings>
</version>
</oracle.manageddataaccess.client>
</configuration>
我尝试了不同的设置(NTS、none、全部)并将连接字符串更改为 User Id=XXX;password=XXX;Data Source=MyDataSource;,但错误保持不变。
问题
- 什么可能导致 ORA-12537 网络会话文件结束 异常?
- 是否缺少引用/依赖项?
- 是否需要在数据库服务器上进行配置?
更新
在服务器上,我们在 alert.log.
中收到 ORA-12679:本机服务被其他进程禁用但需要 错误好像跟加密有关系。注释掉服务器中的以下行 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 Managed Driver 12c:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
编辑:现在支持 ASO。升级到 ODAC 12c 第 4 版或更高版本。如果这不能解决您的问题,请检查数据库服务器上的 alert.log 并调查 (google) 尝试连接时出现的任何错误。
原答案:
截至撰写本文时(2015 年 4 月 30 日),不支持使用 ODP.NET 托管驱动程序进行 Oracle 高级安全选项 (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 客户端。
由于 dll:s 在 GAC 中总是首先使用不支持 ASO 的旧版本,但我认为我使用的是较新的版本。
解决方案是从 GAC 中卸载旧版本。 12.1.2400 Nuget 包自述文件中的第一个安装步骤是 "Un-GAC and unconfigure any existing assembly".
我也为这个错误而苦恼。 最后我尝试使用 Oracle.ManagedDataAccess.dll for 12c(版本 4.122.1.0)。从 ODAC 安装目录 (\odp.net\managed\common) 为上述 dll 创建了一个引用,它工作了...!!!分享我的解决方案。
有一些相同的问题。在注册表中找到一个条目: HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\oracle。 如果此部分包含一个 ODP.NET.managed 条目,则可以使用另一个键(名称版本依赖)检查此条目是否包含一个名为 TNS_ADMIN 的字符串。应删除此字符串或将值更改为不存在的目录。如果该字符串存在并指向有效目录,Managed Client 不会使用配置文件中的设置并失败。 应该使用进一步的调查,但我的东西工作了,必须推迟休息....
我得到了这个错误,这是一个简单的例子,我的查询 运行 有一个错误。