Подтвердить что ты не робот

Ошибка Oracle.Net ManagedDataAccess: не удалось загрузить тип "OracleInternal.Common.ConfigBaseClass" из сборки

У меня есть проект, который работает локально, на нашем dev-сервере и на нашем производственном сервере.

Когда я пытаюсь запустить его на тестовом сервере, я получаю сообщение об ошибке ниже, и я не знаю, что делать с ним за пределами взгляда на моем экране. Советы? Процесс отслеживания проблемы с ее источником?

Я установил пакет NuGet для Oracle 12.2 и т.д.

Не удалось загрузить тип 'OracleInternal.Common.ConfigBaseClass' из сборка 'Oracle.ManagedDataAccess, Version = 4.121.2.0, Культура = нейтральная, PublicKeyToken = 89b483f429c47342 '. Описание: необработанное исключение произошло во время выполнения текущей сети запрос. Просмотрите трассировку стека для получения дополнительной информации о и где он возник в коде.

Сведения об исключении: System.TypeLoadException: не удалось загрузить тип "OracleInternal.Common.ConfigBaseClass" из сборки 'Oracle.ManagedDataAccess, Версия = 4.121.2.0, Культура = нейтральная, PublicKeyToken = 89b483f429c47342'.

Ошибка источника:

Необработанное исключение было создано во время выполнения текущий веб-запрос. Информация о происхождении и местонахождении исключение может быть идентифицировано с использованием трассы стека исключений ниже.

Трассировка стека:

[TypeLoadException: не удалось загрузить тип "OracleInternal.Common.ConfigBaseClass" из сборки 'Oracle.ManagedDataAccess, Версия = 4.121.2.0, Культура = нейтральная, PublicKeyToken = 89b483f429c47342.]
Oracle.ManagedDataAccess.EntityFramework.EntityFrameworkProviderSettings.Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.IEFProviderSettings.get_TracingEnabled() +0 Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.InitializeProviderSettings() +111 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..ctor() +629 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..cctor() +28

[TypeInitializationException: инициализатор типа для 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices' бросил исключение.]
Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.get_Instance() +24

В Web.Config есть следующие блоки:

  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>

и

  <oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <dataSource alias="PVMDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=pdxcludds108.pacificorp.us)(PORT=11086))(CONNECT_DATA=(SERVICE_NAME=DDS1086.PACIFICORP.US))) " />
      </dataSources>
    </version>
  </oracle.manageddataaccess.client>
  <connectionStrings>
    <add name="OracleDbContext" providerName="Oracle.ManagedDataAccess.Client" connectionString="User Id=USERID;Password=WORKINGPASSWORD;Data Source=PVMDataSource" />
    <add name="PVMEntities" connectionString="metadata=res://*/Models.PVMModel.csdl|res://*/Models.PVMModel.ssdl|res://*/Models.PVMModel.msl;provider=Oracle.ManagedDataAccess.Client;provider connection string=&quot;DATA SOURCE=pdxcludds108.pacificorp.us:11086/DDS1086.PACIFICORP.US;PASSWORD=XXXXXXX;PERSIST SECURITY INFO=True;USER ID=XXX&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

ПРИМЕЧАНИЕ. На этом сервере работают другие проекты, они просто используют другую версию клиента Oracle для .Net. Ни один из остальных не использует только управляемый драйвер. Я ищу способ разобраться в этой ошибке, некоторые подсказки относительно того, откуда этот тип загружается и загружается.

4b9b3361

Ответ 1

Существует конфликт между Oracle.ManagedDataAccess от NuGet и тем, который установлен (путем установки клиента Oracle) на сервере и зарегистрирован в GAC.

Отмените регистрацию Oracle.ManagedDataAccess с GAC и вы избавитесь от ошибки: запустите командную строку и перейдите в каталог:

{Oracle home}\product\{version}\client_64\ODP.NET\managed\x64

Там вы должны найти файл OraProvCfg.exe. Выполните следующую команду, чтобы отменить регистрацию Oracle.ManagedDataAccess из GAC:

OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess 

Ответ 2

Вам нужно удалить сборку Oracle.ManagedDataAccess в GAC (C:\Windows\Microsoft.NET\assembly...)

Используйте инструмент командной строки gacutil, чтобы удалить сборку:

C:\Program Files (x86)\Microsoft SDK\Windows\YOUR_VERSION\bin\NETFX 4.6.1 Инструменты > gacutil/u Oracle.ManagedDataAccess

Ответ 3

Удалось исправить это, заменив ссылки в проекте на Oracle.ManagedDataAccess и Oracle.ManagedDataAccess.EntityFramework из тех, которые установлены диспетчером пакетов, на те, которые установлены установщиком клиента oracle. Версии те же, но номер сборки отличается от этих DLL

Ответ 4

Как говорили другие, вам нужно удалить Oracle.ManagedDataAccess из GAC.

Я запускаю {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.bat и {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat, и он работал

Ответ 5

Если удаление DLL из GAC не вариант, рассмотрите возможность получения следующей версии oracle.managedData.access 12.2.1 и просто поместите их на сервер в каталоге bin. После этого вам нужно добавить AssemblyBinding в ваш файл web.config.

Таким образом, вы получаете возможность получить версию 12.1.2 из GAC во время выполнения, что приведет к ошибке. Вам не нужно перекомпилировать ваше приложение с новой версией.

      <dependentAssembly>
        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-12.1.2.0" newVersion="12.2.1.0" />
      </dependentAssembly>

Ответ 6

Есть определенно что-то странное в этой проблеме. Я разрабатывал приложение на своем локальном сервере, который работал нормально, но получил эту ошибку, когда я загрузил приложение на наш сервер. На сервере установлен клиент oracle. Посмотрев этот поток, я скопировал две библиотеки DLL (Oracle.ManagedDataAccess.dll и Oracle.ManagedDataAccess.EntityFramework.dll) из клиента oracle и заменил версии в моем каталоге bin приложения. Это устранило проблему.

Ответ 7

В моем сценарии у меня есть консольное приложение, использующее утилиту базы данных библиотеки классов. Мне пришлось ссылаться на Oracle.ManagedDataAccess также в консольном приложении, чтобы оно могло найти dll во время выполнения. Я не знаю, является ли это лучшим подходом, но сработало для меня.

Ответ 8

У нас была та же проблема, что и у Дилана выше. Похоже, проблема связана с этой конкретной версией Oracle (4.121.2.0).

Решение было простым: просто зайдите в Nuget и перейдите к следующей версии пакета Nuget для Oracle.ManagedDataAccess.Client, 4.122.1.0.

Как только мы это сделаем, мы могли бы смешивать клиентские или не клиентские среды Oracle или серверы с или без установленного GAC Oracle, оставить старые приложения, которые все еще используют GAC, и добавить новые проекты, использующие пакеты Nuget. В этих блогах всегда плохая идея просить людей удалить устаревшие вещи - например, удалить Oracle dll в GAC на сервере - когда у вас есть среды со многими устаревшими зависимостями, которые все еще могут ссылаться на них.

Ответ 9

Вам необходимо установить драйверы Oracle Client. Пакеты .NET не содержат их; они обеспечивают перевод из управляемого мира в неуправляемый. Драйверы находятся в неуправляемом мире и должны быть установлены должным образом.