J'ai un projet qui fonctionne localement, sur notre serveur de développement et sur notre serveur de production.
Lorsque j'essaye de l'exécuter sur le serveur de test, j'obtiens l'erreur ci-dessous, et je ne sais pas quoi faire à ce sujet au-delà de regarder mon écran en blanc. Astuces? Processus pour remonter le problème à sa source?
J'ai installé le package NuGet pour Oracle 12.2, etc.
Impossible de charger le type 'OracleInternal.Common.ConfigBaseClass' à partir de l'assembly 'Oracle.ManagedDataAccess, Version = 4.121.2.0, Culture = neutral, PublicKeyToken = 89b483f429c47342'. Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code.
Détails de l'exception: System.TypeLoadException: impossible de charger le type 'OracleInternal.Common.ConfigBaseClass' de l'assembly 'Oracle.ManagedDataAccess, Version = 4.121.2.0, Culture = neutral, PublicKeyToken = 89b483f429c47342'.
Erreur source:
Une exception non gérée a été générée lors de l'exécution de la demande Web actuelle. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de pile d'exceptions ci-dessous.
Trace de la pile:
[TypeLoadException: impossible de charger le type 'OracleInternal.Common.ConfigBaseClass' à partir de l'assembly 'Oracle.ManagedDataAccess, Version = 4.121.2.0, Culture = neutral, PublicKeyToken = 89b483f429c47342'.]
Oracle.ManagedDataAccess.EntityFramework.EntityFrameworkProviderSettings.Oracle.ManagedDataAccess.EntityFramework.EFProviderSettings.IEFProviderSettings.get_TracingEnabled () +.Oracle.ManagedDataAccess.EntityFrameworkFac.ForameFile ctor () +629 Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices..cctor () +28[TypeInitializationException: l'initialiseur de type pour 'Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices' a levé une exception.]
Oracle.ManagedDataAccess.EntityFramework.EFOracleProviderServices.get_Instance () +24
Le Web.Config contient les blocs suivants:
<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>
ET
<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="DATA SOURCE=pdxcludds108.pacificorp.us:11086/DDS1086.PACIFICORP.US;PASSWORD=XXXXXXX;PERSIST SECURITY INFO=True;USER ID=XXX"" providerName="System.Data.EntityClient" />
</connectionStrings>
REMARQUE: d'autres projets fonctionnent sur ce serveur, ils utilisent simplement une version différente du client Oracle pour .Net. Aucun des autres n'utilise uniquement le pilote géré. Je cherche un moyen de creuser dans cette erreur, un indice sur la provenance et le chargement de ce type.
Il existe un conflit entre Oracle.ManagedDataAccess
de NuGet et celui qui est installé (par l'installation du client Oracle) sur un serveur et qui est enregistré dans GAC.
Désinscrire Oracle.ManagedDataAccess
de GAC et vous vous débarrasserez de l'erreur: Exécutez la ligne de commande et accédez au répertoire:
{Oracle home}\product\{version}\client_64\ODP.NET\managed\x64
Vous devriez y trouver OraProvCfg.exe
fichier. Exécutez la commande suivante pour désinscrire Oracle.ManagedDataAccess
de GAC:
OraProvCfg /action:ungac /providerPath:Oracle.ManagedDataAccess
Vous devez supprimer l'assembly Oracle.ManagedDataAccess dans votre GAC (C:\Windows\Microsoft.NET\Assembly ... )
Utilisez l'outil de commande
gacutil
pour supprimer l'assembly:C:\Program Files (x86)\Microsoft SDKs\Windows\YOUR_VERSION\bin\NETFX 4.6.1 Tools> gacutil/u Oracle.ManagedDataAccess
A pu le corriger en remplaçant les références du projet par Oracle.ManagedDataAccess et Oracle.ManagedDataAccess.EntityFramework de celles installées par le gestionnaire de packages à celles installées par le programme d'installation du client Oracle. Les versions sont les mêmes mais le numéro de build est différent sur ces DLL
Comme d'autres l'ont dit, vous devez supprimer Oracle.ManagedDataAccess de GAC.
Je cours {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x64\unconfigure.bat
et {Oracle home}\product\12.1.0\dbhome_1\ODP.NET\managed\x836\unconfigure.bat
et ça a marché
Si la suppression du DLL du GAC n'est pas une option, envisagez d'obtenir la prochaine version d'Oracle.managedData.access 12.2.1 et placez-les simplement sur le serveur dans le répertoire bin. Ensuite, vous devez pour ajouter un assemblyBinding à votre fichier web.config.
De cette façon, vous obtenez en tirant la version 12.1.2 du GAC pendant l'exécution qui détectera l'erreur. Vous n'avez pas besoin de recompiler votre application avec la nouvelle version.
<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>
Il y a certainement quelque chose de bizarre avec ce problème. Je développais une application sur mon serveur local qui fonctionnait bien, mais j'ai eu cette erreur lorsque j'ai téléchargé l'application sur notre serveur. Le client a installé le client Oracle. Après avoir regardé ce fil, j'ai copié les deux DLL (Oracle.ManagedDataAccess.dll
& Oracle.ManagedDataAccess.EntityFramework.dll
) à partir du client Oracle et a remplacé les versions dans mon répertoire bin d'application. Cela a résolu le problème.
Dans mon scénario, j'ai une application console consommant un utilitaire de base de données de bibliothèque de classes. J'ai dû faire référence à Oracle.ManagedDataAccess également sur l'application console afin qu'il puisse trouver la DLL lors de l'exécution. Je ne sais pas si c'est la meilleure approche, mais cela a fonctionné pour moi.