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

Posted

技术标签:

【中文标题】ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话结束文件【英文标题】:ODP.NET Oracle.ManagedDataAccess causes ORA-12537 network session end of file 【发布时间】:2015-07-03 01:19:32 【问题描述】:

概述

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

异常消息/堆栈跟踪

OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Netzwerksession: Dateiende 在 OracleInternal.Network.ReaderStream.Read(OraBuf OB) 在 OracleInternal.TTC.OraBufReader.GetDataFromNetwork() 在 OracleInternal.TTC.OraBufReader.Read(布尔 bIgnoreData) 在 OracleInternal.TTC.MarshallingEngine.UnmarshalUB1(布尔 bIgnoreData) 在 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包官方Oracle ODP.NET,托管驱动 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、无、全部)并将连接字符串更改为 User Id=XXX;password=XXX;Data Source=MyDataSource;,但错误仍然存​​在。

问题

什么可能导致ORA-12537 网络会话文件结束异常? 是否缺少引用/依赖项? 是否必须在数据库服务器上进行配置?

更新

在服务器上,我们在 alert.log 中收到 ORA-12679: Native services disabled but required 错误。

这似乎与加密有关。注释掉服务器 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/

【问题讨论】:

连接丢失 - 这可能是因为防火墙、Oracle 网络设置或数据库中的错误。一些事情:在尝试托管之前,您是否使用了与您现在使用的完全相同的连接字符串,或者您是否使用了 TNS 别名或不同的数据库/sid?让您的 DBA 检查警报日志以了解您尝试连接时发生的错误。 另外,在调试应用时检查内部异常。可能还有其他 ORA 错误可能指向丢失连接的原因。 是的,我使用了相同的连接字符串。我会要求 DBA 检查错误。 内部异常中的额外 ORA 错误怎么办? 似乎 ORA-12679: Native services disabled by other process but required 正在被抛出数据库。不确定本机服务是什么意思。到目前为止,找不到任何有用的解决此错误消息的方法。 【参考方案1】:

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


原答案:

截至撰写本文时(2015 年 4 月 30 日),不支持使用 ODP.NET 托管驱动程序进行 Oracle 高级安全选项 (ASO) 加密,这是导致您的错误的原因。

这很可能会在未来的某个时候得到支持,因此如果您稍后阅读此内容,请查看最新的 ODP.NET 文档以查看是否需要升级 ODP.NET。

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

【讨论】:

感谢您的帮助。不过,这很可惜。真的希望摆脱大型非托管库。我想我们只需要再等一会儿。 很抱歉。 :( 托管驱动程序在撰写本文时相当新,所有网络和安全层都必须用托管代码重写。有些事情必须推迟到“以后”,这就是其中之一。我建议你搜索“ASO”的功能请求页面并投票:apex.oracle.com/pls/apex/f?p=18357:46【参考方案2】:

自 2015 年 10 月 5 日起,Oracle.ManagedDataAccess 驱动程序(ODAC 12c 第 4 版)支持 ASO。

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

【讨论】:

刚刚替换了我的应用程序中的程序集,它似乎正在工作。谢谢!不过,Oracle 链接对我不起作用。可以在这里找到 nuget 包:nuget.org/packages/Oracle.ManagedDataAccess 我们得到了同样的异常,但不幸的是更新 Oracle.ManagedDataAccess.dll 并没有帮助我们:( Nightcoder,您在 alert.log 中看到了什么?根据您发现的错误,可能是一个完全不同的问题。【参考方案3】:

确保 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 包自述文件中的第一个安装步骤是“取消 GAC 并取消配置任何现有程序集”。

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

我遇到了这个错误,这是一个简单的例子,我正在运行的查询有错误。

【讨论】:

此错误的一般解决方案是:“检查数据库服务器上的 alert.log 并调查 (google) 当您尝试连接时出现的任何错误。” Oracle Estate 的问题是我无法控制的,如果我需要查看警报日志,我必须向 DBA 提出支持请求,然后等待永恒:(

以上是关于ODP.NET Oracle.ManagedDataAccess 导致 ORA-12537 网络会话结束文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ODP.Net 传递字节数组?

.NET Core 使用ODP.NET Core连接操作Oracle数据库

ODP.Net 中的连接字符串

ODP.NET TNS:无法解决错误

将 System.Data.OracleClient 替换为 Oracle.DataAccess (ODP.NET)

将 ODP.Net 与 NHibernate 与 .net System.decimal 一起使用