Appeler des opérations sur la base de données Oracle à l’aide du modèle de canal WCF
Vous pouvez appeler des opérations sur l’adaptateur Oracle Database à l’aide d’une forme IRequestChannel ou IOutputChannel pour envoyer des messages à l’adaptateur. Le modèle de base consiste à créer une fabrique de canaux pour la forme de canal requise à l’aide d’une liaison (OracleDBBinding) et d’un point de terminaison créé à partir d’un URI de connexion. Vous créez ensuite un message instance qui représente un message SOAP conforme au schéma de message pour votre opération cible. Vous pouvez ensuite envoyer ce message à l’adaptateur Oracle Database à l’aide d’un canal créé à partir de la fabrique de canaux. Si vous utilisez un IRequestChannel, vous recevez une réponse. En cas de problème lors de l’exécution de l’opération sur la base de données Oracle, l’adaptateur Oracle Database lève une exception Microsoft.ServiceModel.Channels.Common.TargetSystemException.
Pour obtenir une vue d’ensemble de l’envoi d’opérations à l’aide d’un IRequestChannel dans WCF, consultez « Programmation de Channel-Level client » à l’adresse https://go.microsoft.com/fwlink/?LinkId=106081.
Les sections de cette rubrique fournissent des informations pour vous aider à appeler des opérations sur l’adaptateur Oracle Database à l’aide du modèle de canal WCF.
Création et consommation de messages pour les opérations sortantes
Pour appeler une opération sur l’adaptateur Oracle Database, vous envoyez le message de demande pour l’opération cible à l’aide d’un IRequestChannel ou d’un IOutputChannel. Si vous utilisez un IRequestChannel , l’adaptateur retourne les résultats de l’opération dans le message de réponse.
Pour plus d’informations sur les schémas de message de requête et de réponse et les actions de message pour chaque opération, consultez Messages et schémas de message pour l’adaptateur BizTalk pour Oracle Database.
La façon dont vous créez le message de demande et consommez le message de réponse détermine si la diffusion en continu de nœud ou la diffusion en continu de valeur de nœud est effectuée par l’adaptateur. Cela détermine à son tour si la diffusion en continu de bout en bout des données métier est effectuée pour les opérations prises en charge.
Création du message de demande
Vous pouvez créer le message de demande de deux façons :
Pour créer un message qui peut être utilisé pour la diffusion en continu de valeur de nœud, vous devez passer le corps du message dans un XmlBodyWriter qui implémente la diffusion en continu de valeur de nœud.
Pour créer un message qui peut être utilisé pour la diffusion en continu de nœuds, vous pouvez passer le corps du message dans un xmlReader.
Vous utilisez généralement la diffusion en continu de valeur de nœud pour prendre en charge la diffusion en continu de bout en bout des données métier Oracle dans le message de demande. La seule opération qui prend en charge cette fonctionnalité est UpdateLOB.
Consommation du message de réponse
Vous pouvez utiliser le message de réponse de l’une des deux manières suivantes :
Pour consommer le message à l’aide de la diffusion en continu de valeur de nœud, vous devez appeler la méthode WriteBodyContents sur le message de réponse et lui transmettre un XmlDictionaryWriter qui implémente la diffusion en continu de valeur de nœud.
Pour utiliser le message à l’aide de la diffusion en continu de nœuds, vous pouvez appeler GetReaderAtBodyContents sur le message de réponse afin d’obtenir un XmlReader.
Vous utilisez généralement la diffusion en continu de valeur de nœud pour prendre en charge la diffusion en continu de bout en bout des données métier Oracle dans le message de réponse. De nombreuses opérations prennent en charge cette fonctionnalité.
Prise en charge de la diffusion en continu de données et de messages métier
Pour plus d’informations sur la façon dont l’adaptateur Oracle Database prend en charge la diffusion en continu sur les données métier, consultez Diffusion en continu de types de données d’objets volumineux dans l’adaptateur Oracle Database.
Pour plus d’informations sur l’implémentation de la diffusion en continu de valeur de nœud dans votre code pour prendre en charge la diffusion en continu de bout en bout de données LOB, consultez Streaming Oracle Database LOB Types de données à l’aide du modèle de canal WCF.
Prise en charge des transactions sur les opérations sortantes dans le modèle de canal WCF.
L’adaptateur exécute chaque opération que vous appelez dans une transaction dédiée sur la base de données Oracle. Vous pouvez contrôler le niveau d’isolation de ces transactions en définissant la propriété de liaison TransactionIsolationLevel .
À propos des exemples utilisés dans cette rubrique
L’exemple de cette rubrique utilise scott. Table ACCOUNTACTIVITY. Un script pour générer ces artefacts est fourni avec les exemples sdk. Pour plus d’informations sur les exemples de KIT de développement logiciel (SDK), consultez Exemples dans le Kit de développement logiciel (SDK).
Comment appeler une opération à l’aide d’un canal ?
Pour appeler une opération à l’aide d’un IRequestChannel, procédez comme suit.
Comment appeler une opération à l’aide d’un instance de IRequestChannel
Créez une fabrique de canaux (ChannelFactory<IRequestChannel>). Pour ce faire, vous devez spécifier une liaison (OracleDBBinding) et une adresse de point de terminaison. Vous pouvez spécifier la liaison et l’adresse de point de terminaison de manière impérative dans votre code ou de manière déclarative dans la configuration. Pour plus d’informations sur la spécification de la liaison et de l’adresse de point de terminaison dans la configuration, consultez Créer un canal à l’aide d’Oracle Database.
// Create a binding OracleDBBinding binding = new OracleDBBinding(); // Create an endpoint address by using the connection URI EndpointAddress address = new EndpointAddress("oracledb://ADAPTER"); // Create the channel factory ChannelFactory<IRequestChannel> factory = new ChannelFactory<IRequestChannel>(binding, address);
Définissez les informations d’identification du mot de passe de nom d’utilisateur pour la fabrique de canaux à l’aide de la propriété ClientCredentials .
factory.Credentials.UserName.UserName = "SCOTT"; factory.Credentials.UserName.Password = "TIGER";
Ouvrez la fabrique de canal.
factory.Open();
Obtenez un canal à partir de la fabrique et ouvrez-le.
IRequestChannel channel = factory.CreateChannel(); channel.Open();
Créez un message instance pour l’opération cible. Assurez-vous que l’action de message pour l’opération cible est spécifiée. Dans cet exemple, le corps du message est passé en créant un XmlReader sur un fichier. L’opération cible est une opération Select sur la table SCOTT/EMP.
XmlReader readerIn = XmlReader.Create("SelectAllActivity.xml"); Message messageIn = Message.CreateMessage(MessageVersion.Default, "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select", readerIn);
Appelez la méthode Request sur le canal pour envoyer le message à l’adaptateur Oracle Database et recevoir la réponse. Si la base de données Oracle rencontre une exception, l’adaptateur lève une exception TargetSystemException. (D’autres exceptions sont possibles pour les exceptions non Oracle.) Vous pouvez obtenir une description de l’erreur Oracle à partir de la propriété InnerException.Message de l’objet TargetSystemException.
try { Message messageOut = channel.Request(messageIn); } catch (Exception ex) { // handle exception }
Traitez la réponse. Dans cet exemple, GetReaderAtBodyContents est appelé sur le message de réponse pour obtenir le corps du message.
XmlReader readerOut = messageOut.GetReaderAtBodyContents();
Lorsque vous avez terminé de traiter le message de réponse, fermez le lecteur et le message.
readerOut.Close(); messageOut.Close();
Lorsque vous avez terminé d’utiliser le canal et la fabrique de canal, fermez-les. La fermeture de la fabrique ferme tous les canaux qui ont été créés avec elle.
channel.Close() factory.Close();
Vous suivez les mêmes étapes pour envoyer un message à l’aide de la forme IOutputChannel , sauf :
Vous créez un canal ChannelFactory<IOutputChannel> à l’étape 1.
Vous appelez la méthode Send sur le canal à l’étape 6.
channel.Send(messageIn);
.Aucun message de réponse n’est retourné pour un IOutputChannel.
Exemple
L’exemple suivant montre comment appeler une opération Select à l’aide d’un canal IRequestChannel . Le message de réponse Select est consommé à l’aide d’un XmlReader et le nombre d’enregistrements retournés est écrit dans la console.
using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using Microsoft.ServiceModel.Channels;
using Microsoft.Adapters.OracleDB;
using System.Xml;
using System.IO;
using System.Runtime.Serialization;
namespace RequestChanneSample
{
class Program
{
static void Main(string[] args)
{
// The Select operation request message
const string selectRequestString =
"\<Select xmlns=\"http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY\"\>" +
"<COLUMN_NAMES>*</COLUMN_NAMES>" +
"<FILTER>ACCOUNT = 100002</FILTER>" +
"</Select>";
try
{
// Create binding -- specify binding properties before you open the factory.
OracleDBBinding odbBinding = new OracleDBBinding();
// Create address.
EndpointAddress odbAddress = new EndpointAddress("oracledb://ADAPTER/");
// Create channel factory from binding and address.
ChannelFactory<IRequestChannel> factory =
new ChannelFactory<IRequestChannel>(odbBinding, odbAddress);
// Specify credentials
factory.Credentials.UserName.UserName = "SCOTT";
factory.Credentials.UserName.Password = "TIGER";
// Open the factory.
factory.Open();
// Get a channel.
IRequestChannel channel = factory.CreateChannel();
// Open the channel.
channel.Open();
// Create the request message from the string
StringReader strReader = new StringReader(selectRequestString);
XmlReader readerIn = XmlReader.Create(strReader);
Message requestMessage = Message.CreateMessage(MessageVersion.Default,
"http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select",
readerIn);
Send the message and get a respone
Message responseMessage = channel.Request(requestMessage);
// Get an XmlReader from the message
XmlReader readerOut = (XmlReader) responseMessage.GetReaderAtBodyContents();
// Count the number of records returned and write to the console.
readerOut.MoveToContent();
int numberOfRecordsReturned = 0;
while (readerOut.Read())
{
if (readerOut.NodeType == XmlNodeType.Element && readerOut.Name == "ACCOUNTACTIVITYRECORDSELECT")
numberOfRecordsReturned++;
}
Console.WriteLine("{0} records returned.", numberOfRecordsReturned);
// Close the output reader and message
readerOut.Close();
responseMessage.Close();
//Close channel
channel.Close();
//Close the factory
factory.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Voir aussi
Développer des applications Oracle Database à l’aide du modèle de canal WCF