Freigeben über


Aufrufen von Vorgängen für die Oracle-Datenbank mithilfe des WCF-Kanalmodells

Sie können Vorgänge für den Oracle Database-Adapter aufrufen, indem Sie ein IRequestChannel - oder IOutputChannel-Shape verwenden, um Nachrichten an den Adapter zu senden. Das grundlegende Muster besteht darin, eine Kanalfactory für die erforderliche Kanalform mithilfe einer Bindung (OracleDBBinding) und eines Endpunkts zu erstellen, der aus einem Verbindungs-URI erstellt wurde. Anschließend erstellen Sie eine Message-instance, die eine SOAP-Nachricht darstellt, die dem Nachrichtenschema für Ihren Zielvorgang entspricht. Anschließend können Sie diese Nachricht mithilfe eines Kanals, der von der Kanalfactory erstellt wurde, an den Oracle Database-Adapter senden. Wenn Sie einen IRequestChannel verwenden, erhalten Sie eine Antwort. Wenn beim Ausführen des Vorgangs für die Oracle-Datenbank ein Problem auftritt, löst der Oracle Database-Adapter eine Microsoft.ServiceModel.Channels.Common.TargetSystemException aus.

Eine Übersicht über das Senden von Vorgängen mit einem IRequestChannel in WCF finden Sie unter "Client Channel-Level Programming" unter https://go.microsoft.com/fwlink/?LinkId=106081.

Die Abschnitte in diesem Thema enthalten Informationen zum Aufrufen von Vorgängen für den Oracle Database-Adapter mithilfe des WCF-Kanalmodells.

Erstellen und Verwenden von Nachrichten für ausgehende Vorgänge

Um einen Vorgang für den Oracle Database-Adapter aufzurufen, senden Sie die Anforderungsnachricht für den Zielvorgang entweder mit einem IRequestChannel oder einem IOutputChannel. Wenn Sie einen IRequestChannel verwenden, gibt der Adapter die Ergebnisse des Vorgangs in der Antwortnachricht zurück.

Ausführlichere Informationen zu den Anforderungs- und Antwortnachrichtenschemas und den Nachrichtenaktionen für jeden Vorgang finden Sie unter Nachrichten und Nachrichtenschemas für BizTalk-Adapter für Oracle-Datenbank.

Wie Sie die Anforderungsnachricht erstellen und die Antwortnachricht nutzen, bestimmt, ob das Knotenstreaming oder das Knotenwertstreaming vom Adapter ausgeführt wird. Dadurch wird wiederum bestimmt, ob ein End-to-End-Streaming von LOB-Daten für unterstützte Vorgänge ausgeführt wird.

Erstellen der Anforderungsnachricht

Sie können die Anforderungsnachricht auf zwei Arten erstellen:

  • Um eine Nachricht zu erstellen, die für das Node-Wert-Streaming verwendet werden kann, müssen Sie den Nachrichtentext in einem XmlBodyWriter übergeben, der das Knotenwertstreaming implementiert.

  • Um eine Nachricht zu erstellen, die für das Knotenstreaming verwendet werden kann, können Sie den Nachrichtentext in einem XmlReader übergeben.

    In der Regel verwenden Sie Das Knoten-Wert-Streaming, um das End-to-End-Streaming von Oracle LOB-Daten in der Anforderungsnachricht zu unterstützen. Der einzige Vorgang, der dieses Feature unterstützt, ist UpdateLOB.

Verwenden der Antwortnachricht

Sie können die Antwortnachricht auf zwei Arten nutzen:

  • Um die Nachricht mithilfe von Node-Wert-Streaming zu nutzen, müssen Sie die WriteBodyContents-Methode für die Antwortnachricht aufrufen und ihr einen XmlDictionaryWriter übergeben, der das Knotenwertstreaming implementiert.

  • Um die Nachricht mithilfe des Knotenstreamings zu nutzen, können Sie GetReaderAtBodyContents in der Antwortnachricht aufrufen, um einen XmlReader abzurufen.

    Sie verwenden in der Regel das Knotenwertstreaming, um das End-to-End-Streaming von Oracle LOB-Daten in der Antwortnachricht zu unterstützen. Es gibt viele Vorgänge, die dieses Feature unterstützen.

Unterstützung für Branchendaten- und Nachrichtenstreaming

Weitere Informationen dazu, wie der Oracle Database-Adapter das Streaming für BRANCHENdaten unterstützt, finden Sie unter Streaming von Datentypen für große Objekte im Oracle Database-Adapter.

Weitere Informationen zum Implementieren des Knoten-Wert-Streamings in Ihrem Code zur Unterstützung des End-to-End-Streamings von LOB-Daten finden Sie unter Streaming von Oracle Database LOB-Datentypen mithilfe des WCF-Kanalmodells.

Transaktionsunterstützung für ausgehende Vorgänge im WCF-Kanalmodell.

Der Adapter führt jeden Vorgang aus, den Sie in einer dedizierten Transaktion in der Oracle-Datenbank aufrufen. Sie können die Isolationsstufe dieser Transaktionen steuern, indem Sie die TransactionIsolationLevel-Bindungseigenschaft festlegen.

Informationen zu den in diesem Thema verwendeten Beispielen

Im Beispiel in diesem Thema wird scott verwendet. ACCOUNTACTIVITY-Tabelle. Ein Skript zum Generieren dieser Artefakte wird mit den SDK-Beispielen bereitgestellt. Weitere Informationen zu den SDK-Beispielen finden Sie unter Beispiele im SDK.

Wie kann ich einen Vorgang mithilfe eines Kanals aufrufen?

Führen Sie die folgenden Schritte aus, um einen Vorgang mit einem IRequestChannel aufzurufen.

Aufrufen eines Vorgangs mithilfe einer instance von IRequestChannel

  1. Erstellen Sie eine Kanalfactory (ChannelFactory<IRequestChannel>). Hierzu müssen Sie eine Bindung (OracleDBBinding) und eine Endpunktadresse angeben. Sie können die Bindungs- und Endpunktadresse entweder imperativ im Code oder deklarativ in der Konfiguration angeben. Weitere Informationen zum Angeben der Bindung und der Endpunktadresse in der Konfiguration finden Sie unter Erstellen eines Kanals mit 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. Legen Sie mithilfe der ClientCredentials-Eigenschaft die Kennwortanmeldeinformationen für den Benutzernamen für die Kanalfactory fest.

    factory.Credentials.UserName.UserName = "SCOTT";
    factory.Credentials.UserName.Password = "TIGER";
    
  3. Öffnen Sie die Kanalfactory.

    factory.Open();
    
  4. Rufen Sie einen Kanal ab Werk ab, und öffnen Sie ihn.

    IRequestChannel channel = factory.CreateChannel();
    channel.Open();
    
  5. Erstellen Sie eine Instance für den Zielvorgang. Stellen Sie sicher, dass die Nachrichtenaktion für den Zielvorgang angegeben ist. In diesem Beispiel wird der Nachrichtentext übergeben, indem ein XmlReader über eine Datei erstellt wird. Der Zielvorgang ist ein Select-Vorgang in der SCOTT/EMP-Tabelle.

    XmlReader readerIn = XmlReader.Create("SelectAllActivity.xml");
    Message messageIn = Message.CreateMessage(MessageVersion.Default,
        "http://Microsoft.LobServices.OracleDB/2007/03/SCOTT/Table/ACCOUNTACTIVITY/Select",
        readerIn);
    
  6. Rufen Sie die Request-Methode im Kanal auf, um die Nachricht an den Oracle Database-Adapter zu senden und die Antwort zu empfangen. Wenn für die Oracle-Datenbank eine Ausnahme auftritt, löst der Adapter eine TargetSystemException aus. (Andere Ausnahmen sind für Nicht-Oracle-Ausnahmen möglich.) Sie können eine Beschreibung des Oracle-Fehlers aus der InnerException.Message-Eigenschaft der TargetSystemException abrufen.

    try
    {
        Message messageOut = channel.Request(messageIn);
    }
    catch (Exception ex)
    {
        // handle exception
    }
    
  7. Verarbeiten Sie die Antwort. In diesem Beispiel wird GetReaderAtBodyContents für die Antwortnachricht aufgerufen, um den Nachrichtentext abzurufen.

    XmlReader readerOut = messageOut.GetReaderAtBodyContents();
    
  8. Wenn Sie mit der Verarbeitung der Antwortnachricht fertig sind, schließen Sie den Leser und die Nachricht.

    readerOut.Close();
    messageOut.Close();
    
  9. Wenn Sie den Kanal und die Kanalfactory verwenden, schließen Sie sie. Durch das Schließen der Factory werden alle Kanäle geschlossen, die mit ihr erstellt wurden.

    channel.Close()
    factory.Close();
    
    

    Sie führen die gleichen Schritte aus, um eine Nachricht mit dem IOutputChannel-Shape zu senden, außer:

  • In Schritt 1 erstellen Sie eine ChannelFactory-IOutputChannel<>.

  • Sie rufen die Send-Methode für den Kanal in Schritt 6 auf. channel.Send(messageIn);.

  • Es wird keine Antwortnachricht für einen IOutputChannel zurückgegeben.

Beispiel

Das folgende Beispiel zeigt, wie sie einen Select-Vorgang mithilfe eines IRequestChannel-Kanals aufrufen. Die Select-Antwortnachricht wird mithilfe eines XmlReader verwendet, und die Anzahl der zurückgegebenen Datensätze wird in die Konsole geschrieben.

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);
            }
        }
    }
}

Weitere Informationen

Entwickeln von Oracle Database-Anwendungen mithilfe des WCF-Kanalmodells