Как мне настроить tnsnames.ora в asp.net основное веб-приложение?

#oracle #asp.net-core #odp.net #asp.net-core-2.2 #odp.net-managed

#Oracle #asp.net-core #odp.net #asp.net-core-2.2 #odp.net-управляемый

Вопрос:

У меня небольшая asp.net приложение core 2.2, которое должно обращаться к базе данных Oracle; Я использую NuGet Oracle.Управляемый доступ к данным.Ядро (2.18.6), и оно просто работает на моей машине.

Когда я развертываю его на сервере Windows с помощью IIS, я помещаю tnsnames.ora файл в каталог приложения, и снова он просто работает.

Теперь я хочу использовать общий tnsnames.ora файл. Я попробовал web.config следующее (рецепт из StackOverflow / Google answers на похожие вопросы).

 <?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Culture=neutral, PublicKeyToken=89b483f429c47342"/>
  </configSections>

  <!-- skipping app stuff -->

  <oracle.manageddataaccess.client>
    <version number="*">
      <settings>
        <setting name="tns_admin" value="F:pathtotnsadminfolder" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>
  

К сожалению, это не работает (и поскольку базовая версия Oracle.ManagedDataAccess.dll не имеет ODPMSectionHandler класса, это не является большим сюрпризом).

Итак, есть ли способ получить общий tnsnames.ora файл с odp.net ядро?

(PS imo нам нужен odp.net-core тег)

Обновить

  1. Нужно убедиться, что w3wp.exe действительно может получить доступ к файлам.

  2. Установка системной переменной окружения TNS_ADMIN является возможным решением. В данном конкретном случае этого будет достаточно, но мне все еще интересно, как настроить его через web.config .

Комментарии:

1. Определите переменную среды TNS_ADMIN . Переменная среды должна иметь приоритет над всеми другими настройками, например, над реестром (который не применяется к управляемому драйверу) или файлом конфигурации .net.

2. @WernfriedDomscheit не сработал. Вы знаете, нужно ли мне перезапустить IIS, чтобы он узнал о новой переменной среды?

3. @WernfriedDomscheit Я фактически перезапустил IIS ( iisreset /noforce ) — все еще не работает.

4. Да, скорее всего, вам придется перезапустить процесс. Вы определили это в системной среде или в пользовательской среде?

5. @WernfriedDomscheit это находится в разделе «Системные переменные» (кроме того, только что проверил, что это действительно видно во вспомогательном приложении через среду. GetVariable)

Ответ №1:

ODP.NET Ядро не поддерживает конфигурационные файлы, такие как standard ODP.NET делает. Вам нужно будет использовать API конфигурации:

https://docs.oracle.com/en/database/oracle/oracle-data-access-components/18.3/odpnt/InstallCoreConfiguration.html

Ответ №2:

С Oracle.ManagedDataAccess вам не нужно использовать файл tnsnames.ora. На самом деле, вам не нужен клиент Oracle, установленный на веб-сервере. Используйте startup.cs.

 public void ConfigureServices(IServiceCollection services)
{                        
        services.AddEntityFrameworkOracle()
            .AddDbContext<OracleDbContext>(builder => builder.UseOracle(Configuration["Data:OracleDbContext"]),ServiceLifetime.Scoped)
            .AddDbContext<AppsDbContext>(option => option.UseOracle(Configuration["Data:AppsDbConnection:ConnectionString"]), ServiceLifetime.Scoped);
}
  

apsettings.json

 {
 "Logging": {
"LogLevel": {
  "Default": "Warning"
}
},
"AllowedHosts": "*",
"Data": {
"OracleDbContext": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zzz)(PORT=1521))(CONNECT_DATA=(zzzz)));User Id=zzz;Password=zzz;" },
"AppsDbContext": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=yyyy)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=yyyy)));User Id=yyyy;Password=yyyy;" }
}
}
  

Комментарии:

1. Но что, если вы выполняете миграцию с клиента oracle, и у вас уже есть инфраструктура для имен tns?

Ответ №3:

Я только что столкнулся с той же проблемой, как ни странно, настройка переменных env в масштабах всей системы, похоже, не сработала. Мне пришлось настроить его в самом web.config, чтобы он мог найти TNS_ADMIN, вот так:

 <aspNetCore ...>
  <environmentVariables>
    <environmentVariable name="TNS_ADMIN" value="C:Oracleproduct11.2.0client_1networkadmin" />
  </environmentVariables>
</aspNetCore>