ODP.NET Oracle.ManagedDataAccess вызывает конец файла сетевого сеанса ORA-12537
обзор
Я хочу заменить Oracle.DataAccess на Orcale.Управляется DataAccess, но при открытии соединения с последним возникает исключение файла в конце сеанса ORA-12537.
Сообщение об исключении / трассировка стека
{OracleInternal.Network.NetworkException (0x000030F9): ORA-12537: Netzwerksession: Dateiende в OracleInternal.Network.ReaderStream.Read(OB OraBuf) в OracleInternal.TTC.OraBufReader.GetDataFromNetwork() в хранилище данных OracleInternal.Tu.) в 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)
Настройки проекта
Платформа target x86
Target Framework 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)
Настройки проекта
Цель платформы Любой процессор
Target Framework 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) и изменил строку подключения на User Id=XXX; пароль = XXX; Data Source = MyDataSource;, но ошибка остается прежней.
Вопросы
- Что может быть причиной исключения файлового сеанса в сети ORA-12537?
- Ссылка / зависимость отсутствует?
- Нужно ли что-то настраивать на сервере БД?
ОБНОВИТЬ
На сервере мы получаем 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 Managed Driver 12c:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/
5 ответов
Изменить: ASO теперь поддерживается. Обновите до ODAC 12c Release 4 или более поздней версии. Если это не решит вашу проблему, проверьте файл alert.log на сервере базы данных и изучите (google) все ошибки, возникающие при попытке подключения.
Оригинальный ответ:
На момент написания этой статьи (30.04.15) не поддерживается шифрование Oracle Advanced Security Option (ASO) с помощью управляемого драйвера ODP.NET, что и является причиной ваших ошибок.
Скорее всего, это будет поддерживаться в какой-то момент в будущем, поэтому, если вы читаете это позднее, проверьте последние документы ODP.NET, чтобы узнать, требуется ли обновление ODP.NET.
http://docs.oracle.com/cd/E56485_01/win.121/e55744/InstallConfig.htm
По состоянию на 5 октября 2015 г. драйвер Oracle.ManagedDataAccess (ODAC 12c Release 4) поддерживает ASO.
https://apex.oracle.com/pls/apex/f?p=18357:39:18138408495219::NO::P39_ID:28201
Убедитесь, что у вас нет более старых версий Oracle.ManagedDataAccess в GAC. Похоже, что несколько версий dll имеют одинаковую AssemblyVersion.
У меня была более старая версия в CLR 4 GAC (C:\Windows\Microsoft.NET\assembly\GAC_MSIL для меня), которая была установлена с клиентом Oracle 12.1.
Поскольку dll:s в GAC всегда используются первыми, использовалась старая версия, не поддерживающая ASO, но я подумал, что использовал более новую версию.
Решение было удалить старую версию из GAC. Первым этапом установки в файле Readme пакета 12.1.2400 Nuget является "Отключение GAC и отмена конфигурации любой существующей сборки".
Были некоторые из тех же проблем. Нашел запись в реестре: HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\oracle. Если эта часть содержит запись ODP.NET.managed, возможно, с помощью другого ключа (имя зависит от версии), проверьте, содержит ли этот entyr строку с именем TNS_ADMIN. Эта строка должна быть удалена или значение изменено на несуществующий каталог. Если строка существует и указывает на действительный каталог, управляемый клиент не использует параметр из файла конфигурации и завершается ошибкой. Дальнейшее расследование должно быть использовано, но у меня все работает, и я должен отложить все остальное...
Я тоже боролся с этой ошибкой. Наконец я попытался с Oracle.ManagedDataAccess.dll для 12c (версия 4.122.1.0). Создал ссылку на выше dll из установленного каталога ODAC (\odp.net\managed\common), это сработало...!!! Поделиться своим решением.
Я получал эту ошибку, и это был простой случай, когда мой запрос, который я выполнял, имел ошибку.