Подтвердить что ты не робот

ODP.NET Oracle.ManagedDataAccess вызывает конец сеанса сети ORA-12537

Обзор

Я хочу заменить Oracle.DataAccess на Orcale. Управляемый 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(Boolean bIgnoreData)      в OracleInternal.TTC.MarshallingEngine.UnmarshalUB1 (Boolean 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 Call Interface)
  • 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)

Настройки проекта

Цель Plattform Любой процессор
Целевая структура 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, all) и изменил строку подключения на Id = XXX; пароль = XXX; Источник данных = MyDataSource;, но ошибка остается прежней.

Вопросы

  • Что может привести к сбою в сеансе сетевого сеанса ORA-12537?
  • Отсутствует ссылка/зависимость?
  • Что-то нужно настроить на сервере БД?

UPDATE

На сервере мы получаем ORA-12679: Native-сервисы, отключенные другим процессом, но требующие ошибки в файле 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/

4b9b3361

Ответ 1

Изменить: теперь поддерживается ASO. Обновите версию ODAC 12c Release 4 или более поздней версии. Если это не исправить вашу проблему, проверьте alert.log на сервере базы данных и проверьте (google) любые ошибки, возникающие при попытке подключения.


Оригинальный ответ:

На момент написания этой статьи (4/30/15) нет поддержки шифрования Oracle Advanced Security Option (ASO) с управляемым драйвером ODP.NET, что является причиной ваших ошибок.

Скорее всего, это будет возможно в какой-то момент в будущем, поэтому, если вы читаете это позже, проверьте последние документы ODP.NET, чтобы узнать, требуется ли обновление ODP.NET.

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

Ответ 3

Убедитесь, что у вас нет более ранних версий Oracle.ManagedDataAccess в GAC. Кажется, что несколько версий DLL имеют одну и ту же AssemblyVersion.

У меня была более старая версия в CLR 4 GAC (C:\Windows\Microsoft.NET\assembly\GAC_MSIL для меня), которая была установлена ​​с клиентом Oracle 12.1.

Так как dll: s в GAC всегда используются сначала, используется прежняя версия ASO-uncapable, но я думал, что я использовал более новую версию.

Решение заключалось в удалении более старой версии из GAC. Первый шаг установки в файле Readme файла пакета 12.1.2400 Nuget - "Un-GAC и unconfigure любой существующей сборки".

Ответ 4

Я тоже боролся с этой ошибкой. Наконец, я попытался использовать Oracle.ManagedDataAccess.dll для 12c (версия 4.122.1.0). Создал ссылку для вышеуказанной dll из установочной директории ODAC (\ odp.net\managed\common), она сработала...!!! Разделите мое решение.

Ответ 5

Были некоторые из тех же проблем. Нашел запись в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\oracle. Если эта часть содержит запись ODP.NET.managed, возможно, с помощью другого ключа (имя зависит от версии), проверьте, содержит ли этот entyr строку с именем TNS_ADMIN. Эта строка должна быть удалена или значение изменено на несуществующий каталог. Если строка существует и указывает на действительный каталог, управляемый клиент не использует параметр из файла конфигурации и завершается ошибкой. Дальнейшее расследование должно быть использовано, но у меня все работает, и я должен отложить все остальное...

Ответ 6

Я получал эту ошибку, и это был простой случай, когда мой запрос, который я выполнял, имел ошибку.