WCF 채널 모델을 사용하여 Oracle 데이터베이스에서 작업 호출
IRequestChannel 또는 IOutputChannel 셰이프를 사용하여 Oracle 데이터베이스 어댑터에서 작업을 호출하여 어댑터에 메시지를 보낼 수 있습니다. 기본 패턴은 바인딩(OracleDBBinding) 및 연결 URI에서 만든 엔드포인트를 사용하여 필요한 채널 셰이프에 대한 채널 팩터리를 만드는 것입니다. 그런 다음 대상 작업에 대한 메시지 스키마를 준수하는 SOAP 메시지를 나타내는 메시지 instance 만듭니다. 그런 다음 채널 팩터리에서 만든 채널을 사용하여 이 메시지를 Oracle 데이터베이스 어댑터로 보낼 수 있습니다. IRequestChannel을 사용하는 경우 응답을 받습니다. Oracle 데이터베이스에서 작업을 실행하는 데 문제가 있는 경우 Oracle 데이터베이스 어댑터는 Microsoft.ServiceModel.Channels.Common.TargetSystemException을 throw합니다.
WCF에서 IRequestChannel 을 사용하여 작업을 보내는 방법에 대한 개요는 의 https://go.microsoft.com/fwlink/?LinkId=106081"클라이언트 Channel-Level 프로그래밍"을 참조하세요.
이 항목의 섹션에서는 WCF 채널 모델을 사용하여 Oracle 데이터베이스 어댑터에서 작업을 호출하는 데 도움이 되는 정보를 제공합니다.
아웃바운드 작업에 대한 메시지 만들기 및 사용
Oracle 데이터베이스 어댑터에서 작업을 호출하려면 IRequestChannel 또는 IOutputChannel을 사용하여 대상 작업에 대한 요청 메시지를 보냅니다. IRequestChannel을 사용하는 경우 어댑터는 응답 메시지에서 작업의 결과를 반환합니다.
요청 및 응답 메시지 스키마 및 각 작업에 대한 메시지 작업에 대한 자세한 내용은 Oracle Database용 BizTalk 어댑터에 대한 메시지 및 메시지 스키마를 참조하세요.
요청 메시지를 만들고 응답 메시지를 사용하는 방법은 어댑터에서 노드 스트리밍 또는 노드 값 스트리밍을 수행하는지 여부를 결정합니다. 그러면 지원되는 작업에 대해 LOB 데이터의 엔드 투 엔드 스트리밍이 수행되는지 여부가 결정됩니다.
요청 메시지 만들기
다음 두 가지 방법 중 하나로 요청 메시지를 만들 수 있습니다.
노드 값 스트리밍에 사용할 수 있는 메시지를 만들려면 노드 값 스트리밍을 구현하는 XmlBodyWriter 에서 메시지 본문을 전달해야 합니다.
노드 스트리밍에 사용할 수 있는 메시지를 만들려면 XmlReader에서 메시지 본문을 전달할 수 있습니다.
일반적으로 노드 값 스트리밍을 사용하여 요청 메시지에서 Oracle LOB 데이터의 엔드 투 엔드 스트리밍을 지원합니다. 이 기능을 지원하는 유일한 작업은 UpdateLOB입니다.
응답 메시지 사용
다음 두 가지 방법 중 하나로 응답 메시지를 사용할 수 있습니다.
노드 값 스트리밍을 사용하여 메시지를 사용하려면 응답 메시지에서 WriteBodyContents 메서드를 호출하고 노드-값 스트리밍을 구현하는 XmlDictionaryWriter 를 전달해야 합니다.
노드 스트리밍을 사용하여 메시지를 사용하려면 응답 메시지에서 GetReaderAtBodyContents 를 호출하여 XmlReader를 가져올 수 있습니다.
일반적으로 노드 값 스트리밍을 사용하여 응답 메시지에서 Oracle LOB 데이터의 엔드 투 엔드 스트리밍을 지원합니다. 이 기능을 지원하는 많은 작업이 있습니다.
LOB 데이터 및 메시지 스트리밍 지원
Oracle Database 어댑터가 LOB 데이터 스트리밍을 지원하는 방법에 대한 자세한 내용은 Oracle Database 어댑터에서 큰 개체 데이터 형식 스트리밍을 참조하세요.
LOB 데이터의 엔드 투 엔드 스트리밍을 지원하기 위해 코드에서 노드 값 스트리밍을 구현하는 방법에 대한 자세한 내용은 WCF 채널 모델을 사용하여 Oracle Database LOB 데이터 형식 스트리밍을 참조하세요.
WCF 채널 모델의 아웃바운드 작업에 대한 트랜잭션 지원.
어댑터는 Oracle 데이터베이스의 전용 트랜잭션 내에서 호출하는 각 작업을 실행합니다. TransactionIsolationLevel 바인딩 속성을 설정하여 이러한 트랜잭션의 격리 수준을 제어할 수 있습니다.
이 항목에 사용된 예제 정보
이 항목의 예제에서는 SCOTT을 사용합니다. ACCOUNTACTIVITY 테이블. 이러한 아티팩트 생성 스크립트는 SDK 샘플과 함께 제공됩니다. SDK 샘플에 대한 자세한 내용은 SDK의 샘플을 참조하세요.
채널을 사용하여 작업을 호출하려면 어떻게 하나요?
IRequestChannel을 사용하여 작업을 호출하려면 다음 단계를 수행합니다.
IRequestChannel의 instance 사용하여 작업을 호출하는 방법
채널 팩터리를 빌드합니다(ChannelFactory<IRequestChannel>). 이렇게 하려면 바인딩(OracleDBBinding) 및 엔드포인트 주소를 지정해야 합니다. 코드에서 명령적으로 또는 구성에서 선언적으로 바인딩 및 엔드포인트 주소를 지정할 수 있습니다. 구성에서 바인딩 및 엔드포인트 주소를 지정하는 방법에 대한 자세한 내용은 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);
ClientCredentials 속성을 사용하여 채널 팩터리에 대한 사용자 이름 암호 자격 증명을 설정합니다.
factory.Credentials.UserName.UserName = "SCOTT"; factory.Credentials.UserName.Password = "TIGER";
채널 팩터리를 엽니다.
factory.Open();
팩터리에서 채널을 가져와서 엽니다.
IRequestChannel channel = factory.CreateChannel(); channel.Open();
대상 작업에 대한 메시지 instance 만듭니다. 대상 작업에 대한 메시지 동작이 지정되어 있는지 확인합니다. 이 예제에서는 파일 위에 XmlReader 를 만들어 메시지 본문을 전달합니다. 대상 작업은 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);
채널에서 Request 메서드를 호출하여 Oracle 데이터베이스 어댑터에 메시지를 보내고 회신을 받습니다. Oracle 데이터베이스에 예외가 발생하면 어댑터는 TargetSystemException을 throw합니다. (다른 예외는 비 Oracle 예외에 대해 가능합니다.) TargetSystemException의 InnerException.Message 속성에서 Oracle 오류에 대한 설명을 가져올 수 있습니다.
try { Message messageOut = channel.Request(messageIn); } catch (Exception ex) { // handle exception }
응답을 처리합니다. 이 예제에서는 응답 메시지에서 GetReaderAtBodyContents 를 호출하여 메시지 본문을 가져옵니다.
XmlReader readerOut = messageOut.GetReaderAtBodyContents();
응답 메시지 처리가 완료되면 판독기와 메시지를 닫습니다.
readerOut.Close(); messageOut.Close();
채널 및 채널 팩터리 사용을 마쳤으면 닫습니다. 팩터리를 닫으면 팩터리로 만든 모든 채널이 닫힙니다.
channel.Close() factory.Close();
다음을 제외하고 동일한 단계에 따라 IOutputChannel 셰이프를 사용하여 메시지를 보냅니다.
1단계에서 ChannelFactory<IOutputChannel> 을 만듭니다.
6단계에서 채널에서 Send 메서드를 호출합니다.
channel.Send(messageIn);
.IOutputChannel에 대해 반환된 응답 메시지가 없습니다.
예제
다음 예제에서는 IRequestChannel 채널을 사용하여 Select 작업을 호출하는 방법을 보여 줍니다. 응답 선택 메시지는 XmlReader 를 사용하여 사용되며 반환되는 레코드 수는 콘솔에 기록됩니다.
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);
}
}
}
}