Контейнер док-станции ядра asp.net с использованием Oracle Managed Driver Core. выбрасывает ORA-00604 и ORA-01882 при открытии соединения

Я получаю приведенное ниже исключение при попытке подключиться к базе данных Oracle с помощью управляемого доступа к данным Oracle для ядра dotnet ( https://www.nuget.org/packages/Oracle.ManagedDataAccess.Core/) из контейнера докера. Я не получаю исключение за пределами докера

Действия по воспроизведению:

  1. Open VS 2017
  2. Файл> Создать> Проект...
  3. Visual C#>.Net Core> Веб-приложение ASP.Net Core
  4. Нажмите Ok
  5. Выберите "Веб-приложение (модель-представление-контроллер)"
  6. снимите флажок "Включенная поддержка Docker"
  7. снимите флажок "Настроить для HTTPS"
  8. Нажмите Ok
  9. В консоли диспетчера пакетов выполните Install-Package Oracle.ManagedDataAccess.Core -Source nuget.org -Version 2.18.3
  10. Вставьте код в метод HomeController.Index
  11. Установить точку останова на линии con.Open();
  12. Нажмите кнопку "Отладка IIS Express"
  13. Не возникает исключение при попытке открыть соединение.
  14. Прекратить отладку
  15. Щелкните правой кнопкой мыши веб-проект в обозревателе решений> Добавить> Поддержка Docker.
  16. Выберите переключатель "Linux" и нажмите "ОК".
  17. Щелкните правой кнопкой мыши веб-проект в обозревателе решений> Добавить> Поддержка контейнера Orchestrator.
  18. В раскрывающемся списке выберите "Docker Compose" и нажмите "ОК" (в зависимости от установленной версии Visual Studio 2017 это может отличаться)
  19. Нажмите Да, если появятся какие-либо всплывающие окна с просьбой перезаписать файлы
  20. Нажмите кнопку "Отладка" Создать "".
  21. Исключение будет выдано при попытке открыть соединение

Код:

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()

3 ответа

Решение

Я только что пришел к решению в аналогичном контексте (Oracle DB 11.2.0.4.0 и пакет NuGet Oracle.ManagedDataAccess.Core 2.18.3):

Добавьте переменную среды с именем TZ к вашему контейнеру и установите значение для вашего часового пояса, например, CET

Это позволило мне открыть соединение. Тогда я также могу использовать часть из этого решения, чтобы установить информацию о сеансе

this.Connection = new OracleConnection();
this.Connection.ConnectionString = ...
this.Connection.Open();
OracleGlobalization info = this.Connection.GetSessionInfo();
info.TimeZone = "America/New_York";
this.Connection.SetSessionInfo(info);

Эта ошибка устранена в последней Oracle.ManagedDataAccess.Coreнужет пакет.

Оставляю команду на добавление переменной TZ в контейнер:

docker run -e TZ=Америка/Монтевидео -d -p 7991:80 --name name imagename

также добавьте переменную в launchSettings проекта:

      "IIS Express": {
  "commandName": "IISExpress",
  "launchBrowser": true,
  "launchUrl": "swagger",
  "environmentVariables": {
    "ASPNETCORE_ENVIRONMENT": "Development",
    "TZ": "America/Montevideo"
  }
}

Я надеюсь, что это сработает для вас

Другие вопросы по тегам