#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
тег)
Обновить
-
Нужно убедиться, что
w3wp.exe
действительно может получить доступ к файлам. -
Установка системной переменной окружения
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 конфигурации:
Ответ №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>