web-dev-qa-db-fra.com

ODP.NET Oracle.ManagedDataAccess provoque la fin du fichier de la session réseau ORA-12537

Vue d'ensemble

Je souhaite remplacer Oracle.DataAccess par Orcale. Géré DataAccess, mais l'ouverture d'une connexion avec ce dernier génère une fin de session réseau ORA-12537] de fichier exception.

Message d'exception/trace de pile

{OracleInternal.Network.NetworkException (0x000030F9): ORA-12537 : Netzwerksession: Dateiende à OracleInternal.Network.ReaderStream.Read (OraBuf OB) à OracleInternal. TTC.OraBufReader.GetDataFromNetwork () chez OracleInternal.TTC.OraBufReader.Read (Boolean bIgnoreData) chez OracleInternal.TTC.MarshallingEngine.UnmarshalUB1 (Boolean bIgnoreData) chez OracleInternal.TTC.TTCProtection

J'essaie de me connecter à une base de données Oracle 11g et aucun client n'est installé sur mon ordinateur local.

Application test opérationnelle (non gérée)

Utiliser Oracle.DataAccess fonctionne bien .

using System;
using Oracle.DataAccess.Client;

namespace App.Odp.Unmanaged
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            //dummy connection string. using SID 
            string connectionString = "User Id=***;password=***;Data Source=1.2.3.4:1521/sid01;";

            try
            {
                using (var conn = new OracleConnection(connectionString))
                {
                    conn.Open();
                    using (OracleCommand cmd = conn.CreateCommand())
                    {
                        cmd.CommandText = "select * from all_users";

                        using (OracleDataReader reader =     cmd.ExecuteReader())
                        {                            
                            Console.WriteLine("VisibleFieldCount: {0}", reader.VisibleFieldCount);
                            Console.WriteLine("HiddenFieldCount: {0}", reader.HiddenFieldCount);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error:{0}", ex.Message);
            }

            Console.ReadLine();
        }
    }
}

Références et dépendances

  • Oracle.DataAccess (2.111.7.0)
  • oci.dll (11.1.0.1)
  • orannzsbb11.dll (11.1.0.6)
  • oraociei11.dll (Oracle Call Interface Instant Client)
  • OraOps11w.dll (2.111.7.0)

Paramètres du projet

Cible de la plate-forme x86
Cadre cible 4.5

Échec de l'application de test (géré)

Utilisation du package de nuget Pilote géré par Oracle officiel ODP.NET 12.1.21

Le code est identique à ci-dessus. Seul changement:

using System;
using Oracle.ManagedDataAccess.Client;
//... rest the same as above

Références et dépendances

Seulement:

  • Oracle.ManagedDataAccess (4.121.2.0)

Paramètres du projet

Cible de la plate-forme N'importe quel processeur
Cadre cible 4.5

App.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="Oracle.manageddataaccess.client" type="OracleInternal.Common.ODPMSectionHandler, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <system.data>
    <DbProviderFactories>
      <remove invariant="Oracle.ManagedDataAccess.Client" />
      <add name="ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client" description="Oracle Data Provider for .NET, Managed Driver" type="Oracle.ManagedDataAccess.Client.OracleClientFactory, Oracle.ManagedDataAccess, Version=4.121.2.0, Culture=neutral, PublicKeyToken=89b483f429c47342" />
    </DbProviderFactories>
  </system.data>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <publisherPolicy apply="no" />
        <assemblyIdentity name="Oracle.ManagedDataAccess" publicKeyToken="89b483f429c47342" culture="neutral" />
        <bindingRedirect oldVersion="4.121.0.0 - 4.65535.65535.65535" newVersion="4.121.2.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  <Oracle.manageddataaccess.client>
    <version number="*">
      <dataSources>
        <!--<dataSource alias="MyDataSource" descriptor="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(Host=1.2.3.4)(PORT=1521))(CONNECT_DATA=(SID=sid01)))" />-->
      </dataSources>
      <settings>
        <!--<setting name="SQLNET.AUTHENTICATION_SERVICES" value="NTS"/>-->
      </settings>
    </version>
  </Oracle.manageddataaccess.client>
</configuration>

J'ai essayé différents paramètres (NTS, aucun, tous) et changé la chaîne de connexion en ID utilisateur = XXX; mot de passe = XXX; source de données = MyDataSource;, mais l'erreur reste la même.

Des questions

  • Quelle pourrait être la cause de l'exception Fin de fichier de la session réseau ORA-12537?
  • Une référence/dépendance est-elle manquante?
  • Est-ce que quelque chose doit être configuré sur le serveur de base de données?

METTRE À JOUR

Sur le serveur, nous obtenons un ORA-12679: services natifs désactivés par un autre processus mais requis dans le fichier alert.log.

Cela semble avoir quelque chose à voir avec le cryptage. Commenter les lignes suivantes dans les serveurs sqlnet.ora résout le problème.

#SQLNET.AUTHENTICATION_SERVICES=(NTS)
#SQLNET.ENCRYPTION_TYPES_SERVER = (rc4_128, rc4_256)
#SQLNET.ENCRYPTION_SERVER=REQUIRED
#ENCRYPTION_WALLET_LOCATION=
#          (SOURCE=(METHOD=FILE)(METHOD_DATA=
#                  (DIRECTORY=...\%Oracle_SID%\wallet)))

Nouvelle question

Comment configurons-nous ManagedDataAccess pour qu'il fonctionne avec le chiffrement?

Mise à jour 2

Semble fonctionner maintenant avec ODP Managed Driver 12c:
https://www.nuget.org/packages/Oracle.ManagedDataAccess/

9
Greg

Edit: ASO est maintenant supporté. Mettez à niveau vers ODAC 12c version 4 ou ultérieure. Si cela ne résout pas votre problème, consultez le fichier alert.log sur le serveur de base de données et recherchez (sur Google) toutes les erreurs qui s'y produisent lors de la tentative de connexion.


Réponse originale:

Au moment de la rédaction de ce document (30/04/15), le cryptage ASO (Oracle Advanced Security Option) avec le pilote géré ODP.NET n’est pas pris en charge, ce qui est à l’origine des erreurs.

Ceci est très probablement pris en charge à un moment donné dans le futur. Par conséquent, si vous lisez ceci à une date ultérieure, consultez les derniers documents ODP.NET pour savoir si une mise à niveau de ODP.NET est nécessaire.

http://docs.Oracle.com/cd/E56485_01/win.121/e55744/InstallConfig.htm#CHDJIDIG

2
Christian Shay

À compter du 5 octobre 2015, le pilote Oracle.ManagedDataAccess (ODAC 12c version 4) prend en charge ASO.

https://apex.Oracle.com/pls/apex/f?p=18357:39:18138408495219::NO::P39_ID:28201

3
David Dindak

Assurez-vous de ne pas avoir d'anciennes versions de Oracle.ManagedDataAccess dans le GAC. Il semble que plusieurs versions de la DLL ont la même AssemblyVersion.

J'avais une version plus ancienne dans le CLR 4 GAC (C:\Windows\Microsoft.NET\Assembly\GAC_MSIL pour moi) qui avait été installée avec un client Oracle 12.1.

Puisque dll: s dans le GAC sont toujours utilisés en premier, l’ancienne version ASO-uncapable a été utilisée, mais j’ai pensé que j’avais utilisé la version la plus récente.

La solution consistait à désinstaller l'ancienne version du GAC. La première étape de l'installation du fichier Lisez-moi du paquet 12.1.2400 consiste à "désinstaller GAC et à déconfigurer tout assemblage existant".

1

Eu certains des mêmes problèmes. Vous avez trouvé une entrée dans le registre: HKEY_LOCAL_MACHINE\SOFTWARE\wow6432\Oracle. Si cette partie contient une entrée ODP.NET.managed, possible avec une autre clé (nom version dépendante), vérifiez si cet entyr contient une chaîne appelée TNS_ADMIN. Cette chaîne doit être supprimée ou la valeur modifiée pour un répertoire non existant. Si la chaîne existe et pointe vers un répertoire valide, le client géré n'utilise pas le paramètre du fichier de configuration et échoue. Une enquête plus approfondie devrait être utilisée, mais j'ai mes données fonctionnelles et je dois reporter le reste. ..

0
Carl Høgstedt

Moi aussi j'ai eu du mal avec cette erreur. Enfin, j'ai essayé avec Oracle.ManagedDataAccess.dll pour 12c (version 4.122.1.0). Créé une référence pour les dll ci-dessus à partir du répertoire installé ODAC (\ odp.net\managed\common), cela a fonctionné ... !!! Partager ma solution. 

0
Devang Panchalia