Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
È possibile richiamare operazioni sull'adapter Oracle Database 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 del messaggio che rappresenta un messaggio SOAP conforme allo schema del messaggio per l'operazione di destinazione. È quindi possibile inviare il messaggio all'adapter 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 dell'invio di operazioni tramite 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 sull'adapter Oracle Database usando il modello di canale WCF.
Creazione e consumo di messaggi per le operazioni in uscita
Per richiamare un'operazione sull'adapter Oracle Database, inviare il messaggio di richiesta per l'operazione di destinazione usando IRequestChannel o IOutputChannel. Se si usa un 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 dei messaggi per ogni operazione, vedere Messaggi e schemi di messaggio per l'adapter BizTalk per Oracle Database.
La modalità di creazione del messaggio di richiesta e l'utilizzo del messaggio di risposta determinano se lo streaming dei nodi o lo streaming dei valori del nodo viene eseguito dall'adapter. 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 xmlBodyWriter che implementa il flusso node-value.
Per creare un messaggio che può essere usato per il flusso 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 LOB Oracle nel messaggio di richiesta. L'unica operazione che supporta questa funzionalità è UpdateLOB.
Utilizzo del messaggio di risposta
È possibile utilizzare 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 xmlDictionaryWriter che implementa il flusso node-value.
Per utilizzare il messaggio usando lo streaming dei nodi, è 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 LOB Oracle nel messaggio di risposta. Esistono molte operazioni che supportano questa funzionalità.
Supporto per lo streaming di dati e messaggi LOB
Per altre informazioni su come l'adapter Oracle Database supporta lo streaming sui dati LOB, vedere Streaming dei tipi di dati di grandi oggetti nell'adapter 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 la tabella SCOTT.ACCOUNTACTIVITY. Uno script per generare questi artefatti viene fornito con gli esempi dell'SDK. Per altre informazioni sugli esempi dell'SDK, vedere Esempi nell'SDK.
Come richiamare un'operazione usando un canale?
Per richiamare un'operazione usando IRequestChannel, seguire questa procedura.
Come richiamare un'operazione usando un'istanza di IRequestChannel
Creare un costruttore di canali (ChannelFactory<IRequestChannel>). A tale scopo, è necessario specificare un'associazione (OracleDBBinding) e un indirizzo endpoint. È possibile specificare l'indirizzo di associazione ed 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 con 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);Impostare le credenziali del nome utente e della password per la factory di canale usando la proprietà ClientCredentials.
factory.Credentials.UserName.UserName = "SCOTT"; factory.Credentials.UserName.Password = "TIGER";Aprire la fabbrica di canali.
factory.Open();Ottieni un canale dalla fabbrica e aprilo.
IRequestChannel channel = factory.CreateChannel(); channel.Open();Creare un'istanza di Message per l'operazione di destinazione. Assicurarsi che sia specificata l'azione del messaggio per l'operazione di destinazione. 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);Richiamare il metodo Request sul canale per inviare il messaggio all'adapter Oracle Database e ricevere la risposta. Se il database Oracle rileva un'eccezione, l'adapter genera un'eccezione TargetSystemException. Sono possibili altre eccezioni per le eccezioni non Oracle. È possibile ottenere una descrizione dell'errore Oracle dalla proprietà InnerException.Message di TargetSystemException.
try { Message messageOut = channel.Request(messageIn); } catch (Exception ex) { // handle exception }Elaborare la risposta. In questo esempio GetReaderAtBodyContents viene chiamato sul messaggio di risposta per ottenere il corpo del messaggio.
XmlReader readerOut = messageOut.GetReaderAtBodyContents();Al termine dell'elaborazione del messaggio di risposta, chiudere il lettore e il messaggio.
readerOut.Close(); messageOut.Close();Una volta terminato l'uso del canale e della fabbrica di canali, chiudili. La chiusura della fabbrica chiuderà tutti i canali creati con essa.
channel.Close() factory.Close();Seguire la stessa procedura per inviare un messaggio usando la forma IOutputChannel , ad eccezione di:
Si crea un ChannelFactory<IOutputChannel> nel passaggio 1.
Chiamare il metodo Send sul canale nel passaggio 6.
channel.Send(messageIn);.Non viene restituito alcun messaggio di risposta per IOutputChannel.
Esempio
Nell'esempio seguente viene illustrato come richiamare un'operazione Select usando un canale IRequestChannel . Il messaggio di risposta Select viene utilizzato utilizzando 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 Oracle Database usando il modello di canale WCF