Condividi tramite


Richiamare operazioni nel database Oracle usando il modello di canale WCF

È possibile richiamare le operazioni nell'adapter Di database Oracle usando una forma IRequestChannel o IOutputChannel per inviare messaggi all'adapter. Il modello di base consiste nel creare una channel factory per la forma del canale richiesta usando un'associazione (OracleDBBinding) e un endpoint creato da un URI di connessione. Si crea quindi un'istanza di messaggio che rappresenta un messaggio SOAP conforme allo schema del messaggio per l'operazione di destinazione. È quindi possibile inviare questo messaggio all'adattatore Oracle Database usando un canale creato dalla channel factory. Se si usa un IRequestChannel, si riceve una risposta. Se si verifica un problema durante l'esecuzione dell'operazione nel database Oracle, l'adapter di database Oracle genera un'eccezione Microsoft.ServiceModel.Channels.Common.TargetSystemException.

Per una panoramica di come inviare operazioni usando un IRequestChannel in WCF, vedere "Client Channel-Level Programming" all'indirizzo https://go.microsoft.com/fwlink/?LinkId=106081.

Le sezioni di questo argomento forniscono informazioni utili per richiamare le operazioni nell'adapter Di database Oracle usando il modello di canale WCF.

Creazione e utilizzo di messaggi per le operazioni in uscita

Per richiamare un'operazione nell'adapter Oracle Database, inviare il messaggio di richiesta per l'operazione di destinazione usando un IRequestChannel o un IOutputChannel. Se si usa un oggetto IRequestChannel , l'adapter restituisce i risultati dell'operazione nel messaggio di risposta.

Per informazioni più dettagliate sugli schemi dei messaggi di richiesta e risposta e sulle azioni del messaggio per ogni operazione, vedere Messaggi e schemi di messaggi per l'adapter BizTalk per Oracle Database.

Come si crea il messaggio di richiesta e si utilizza il messaggio di risposta determina se lo streaming del nodo o il flusso del valore del nodo viene eseguito dall'adattatore. Ciò determina a sua volta se lo streaming end-to-end dei dati LOB viene eseguito per le operazioni supportate.

Creazione del messaggio di richiesta

È possibile creare il messaggio di richiesta in uno dei due modi seguenti:

  • Per creare un messaggio che può essere usato per lo streaming node-value, è necessario passare il corpo del messaggio in un oggetto XmlBodyWriter che implementa lo streaming node-value.

  • Per creare un messaggio che può essere usato per lo streaming di nodi, è possibile passare il corpo del messaggio in un xmlReader.

    In genere si usa lo streaming node-value per supportare lo streaming end-to-end dei dati Oracle LOB nel messaggio di richiesta. L'unica operazione che supporta questa funzionalità è UpdateLOB.

Utilizzo del messaggio di risposta

È possibile usare il messaggio di risposta in uno dei due modi seguenti:

  • Per utilizzare il messaggio usando il flusso node-value, è necessario chiamare il metodo WriteBodyContents nel messaggio di risposta e passarlo a un oggetto XmlDictionaryWriter che implementa lo streaming node-value.

  • Per utilizzare il messaggio usando il flusso del nodo, è possibile chiamare GetReaderAtBodyContents nel messaggio di risposta per ottenere un xmlReader.

    In genere si usa lo streaming node-value per supportare lo streaming end-to-end dei dati Oracle LOB nel messaggio di risposta. Esistono molte operazioni che supportano questa funzionalità.

Supporto per i dati e lo streaming di messaggi LOB

Per altre informazioni sul modo in cui l'adattatore Oracle Database supporta lo streaming sui dati LOB, vedere Streaming di tipi di dati di oggetti di grandi dimensioni nella scheda Oracle Database.

Per altre informazioni sull'implementazione dello streaming node-value nel codice per supportare lo streaming end-to-end dei dati LOB, vedere Streaming di tipi di dati LOB del database Oracle tramite il modello di canale WCF.

Supporto delle transazioni nelle operazioni in uscita nel modello di canale WCF.

L'adapter esegue ogni operazione richiamata all'interno di una transazione dedicata nel database Oracle. È possibile controllare il livello di isolamento di queste transazioni impostando la proprietà di associazione TransactionIsolationLevel .

Informazioni sugli esempi usati in questo argomento

L'esempio in questo argomento usa SCOTT. Tabella ACCOUNTACTIVITY. Uno script per generare questi artefatti viene fornito con gli esempi di SDK. Per altre informazioni sugli esempi di SDK, vedere Esempi nell'SDK.

Come si richiama un'operazione usando un canale?

Per richiamare un'operazione usando un IRequestChannel, seguire questa procedura.

Come richiamare un'operazione usando un'istanza di IRequestChannel

  1. Creare una channel factory (ChannelFactory<IRequestChannel>). A tale scopo, è necessario specificare un'associazione (OracleDBBinding) e un indirizzo endpoint. È possibile specificare l'indirizzo dell'associazione e dell'endpoint in modo imperativo nel codice o in modo dichiarativo nella configurazione. Per altre informazioni su come specificare l'associazione e l'indirizzo dell'endpoint nella configurazione, vedere Creare un canale usando 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);
    
  2. Impostare le credenziali password del nome utente per la channel factory usando la proprietà ClientCredentials .

    factory.Credentials.UserName.UserName = "SCOTT";
    factory.Credentials.UserName.Password = "TIGER";
    
  3. Aprire la channel factory.

    factory.Open();
    
  4. Ottenere un canale dalla factory e aprirlo.

    IRequestChannel channel = factory.CreateChannel();
    channel.Open();
    
  5. Creare un'istanza del messaggio per l'operazione di destinazione. Assicurarsi che l'azione del messaggio per l'operazione di destinazione sia specificata. In questo esempio il corpo del messaggio viene passato creando un xmlReader su un file. L'operazione di destinazione è un'operazione Select nella tabella 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);
    
  6. Richiamare il metodo Request nel canale per inviare il messaggio all'adapter Oracle Database e ricevere la risposta. Se il database Oracle rileva un'eccezione, l'adapter genera un oggetto TargetSystemException. Altre eccezioni sono possibili per le eccezioni non Oracle. È possibile ottenere una descrizione dell'errore Oracle dalla proprietà InnerException.Message dell'oggetto TargetSystemException.

    try
    {
        Message messageOut = channel.Request(messageIn);
    }
    catch (Exception ex)
    {
        // handle exception
    }
    
  7. Elaborare la risposta. In questo esempio, GetReaderAtBodyContents viene chiamato sul messaggio di risposta per ottenere il corpo del messaggio.

    XmlReader readerOut = messageOut.GetReaderAtBodyContents();
    
  8. Al termine dell'elaborazione del messaggio di risposta, chiudere il lettore e il messaggio.

    readerOut.Close();
    messageOut.Close();
    
  9. Al termine dell'uso del canale e della channel factory, chiuderli. La chiusura della factory chiuderà tutti i canali creati con esso.

    channel.Close()
    factory.Close();
    
    

    Seguire la stessa procedura per inviare un messaggio usando la forma IOutputChannel , ad eccezione di:

  • Si crea un CanaleFactory<IOutputChannel> nel passaggio 1.

  • Si chiama il metodo Send nel canale nel passaggio 6. channel.Send(messageIn);.

  • Non viene restituito alcun messaggio di risposta per un IOutputChannel.

Esempio

Nell'esempio seguente viene illustrato come richiamare un'operazione Select usando un canale IRequestChannel . Il messaggio Di risposta Select viene utilizzato usando un xmlReader e il numero di record restituiti viene scritto nella 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);
            }
        }
    }
}

Vedere anche

Sviluppare applicazioni di Database Oracle usando il modello di canale WCF