Я получаю приведенное ниже исключение при попытке подключиться к базе данных Oracle с использованием Oracle Managed Data Access для ядра dotnet (https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/) изнутри контейнера Docker. Я не получаю исключение за пределами Docker
Шаги для воспроизведения:
- Открыть VS 2017
- Файл> Создать> Проект ...
- Visual C #> .Net Core> ASP.NetБазовое веб-приложение
- Нажмите «ОК»
- Выберите «Веб-приложение (Model-View-Controller)» *
- снимите флажок «Включена поддержка Docker»
- снимите флажок «Настроитьдля HTTPS '
- Нажмите Ok
- В консоли диспетчера пакетов выполните
Install-Package Oracle.ManagedDataAccess.Core -Source nuget.org -Version 2.18.3
- Вставьте код в метод HomeController.Index
- Установите точку останова на линии
con.Open();
- Нажмите кнопку «Отладка IIS Express»
- При попытке открыть соединение не возникает исключение.
- Остановите отладку
- Щелкните правой кнопкой мыши веб-проект вОбозреватель решений> Добавить> Поддержка Docker
- Выберите радио "Linux", нои нажмите кнопку OK
- Щелкните правой кнопкой мыши веб-проект в обозревателе решений> Добавить> Поддержка оркестра контейнеров
- В раскрывающемся списке выберите «Создать докер» и нажмите кнопку «ОК» (в зависимости от версии Visual Studio 2017установлено, это может отличаться)
- Нажмите Да, если появятся какие-либо всплывающие окна с просьбой перезаписать файлы
- Нажмите кнопку «Отладка« Создать »»
- При попытке открыть будет выдано исключениесоединение
Код:
var strm = new Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder();
strm.UserID = "<username>";
strm.Password = "<password>";
strm.DataSource = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=<db_host>)(PORT = 1521))) (CONNECT_DATA=(SERVICE_NAME=<service_name>)))";
using (var con = new Oracle.ManagedDataAccess.Client.OracleConnection(strm.ConnectionString))
{
con.Open(); // Exception thrown here.
}
Исключение:
Oracle.ManagedDataAccess.Client.OracleException
HResult=0x80004005
Message=ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
Source=Oracle Data Provider for .NET, Managed Driver
StackTrace:
at OracleInternal.ConnectionPool.PoolManager`3.Get(ConnectionString csWithDiffOrNewPwd, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OraclePoolManager.Get(ConnectionString csWithNewPassword, Boolean bGetForApp, OracleConnection connRefForCriteria, String affinityInstanceName, Boolean bForceMatch)
at OracleInternal.ConnectionPool.OracleConnectionDispenser`3.Get(ConnectionString cs, PM conPM, ConnectionString pmCS, SecureString securedPassword, SecureString securedProxyPassword, OracleConnection connRefForCriteria)
at Oracle.ManagedDataAccess.Client.OracleConnection.Open()
at WebApplication8.Controllers.HomeController.Index() in C:\Users\me\source\repos\WebApplication8\WebApplication8\Controllers\HomeController.cs:line 22
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeActionMethodAsync>d__12.MoveNext()
Обновление:
Я проводил дополнительное тестирование на основе ответа @silent ниже и выяснил кое-что интересное.Если я откатился до версии 2.12.0-бета3 ядра ODP.Net (https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core) и удалил переменную среды TZ = America / Denver), я смогу открыть соединение без ошибок.Похоже, что-то было введено в 2.18.3 , что вызывает требование к переменной среды TZ при открытии соединения внутри док-контейнера.