XLANGMessage로 표시되는 메시지
XLANGMessage 개체는 XLANG 서비스로 선언된 메시지 instance 나타냅니다. 이 개체는 메서드 호출의 매개 변수로 메시지에 대한 참조를 전달하여 가져옵니다. XLANGPart 개체는 XLANG 서비스 내의 메시지 instance 포함된 메시지 부분을 나타냅니다. 이 개체는 수신 매개 변수 형식이 XLANGPart 인 메서드 호출에서 파트 참조를 전달하거나 전달된 XLANGMessage 참조를 열거하여 가져옵니다.
오케스트레이션 메시지 변수는 사용자 구성 요소에 전달되고 XLANGMessage 개체로 수신될 수 있습니다. XLANGMessage 개체를 사용하면 파트에 액세스하고 메시지 속성에 액세스할 수 있습니다. 사용자는 XLANGMessage를 "보류"하여 선언된 scope 초과하여 수명을 연장할 수 있습니다. 그 후 XLANGMessage 는 메서드에서 반환되고 오케스트레이션의 메시지 변수에 할당될 수 있습니다.
XLANGMessage 생성
스트림을 사용하여 XLANGMessage 를 생성할 때 스트림 형식은 IStreamFactory 를 구현하거나 MemoryStream이어야 합니다. 다음 코드 샘플에서는 XLANGMessage를 생성하는 방법을 보여 줍니다.
public class FileStreamFactory : IStreamFactory
{
string _fname;
public FileStreamFactory(string fname)
{
_fname = fname;
}
public Stream CreateStream()
{
return new FileStream
(
_fname,
FileMode.Open,
FileAccess.Read,
FileShare.Read
);
}
}
public static void AssignStreamFactoryToPart(XLANGMessage msg)
{
IStreamFactory sf = new FileStreamFactory( @”c:\data.xml” );
msg[0].LoadFrom( sf );
}
소스 메시지를 변환하지 않고 새 메시지를 만들어야 하는 경우가 있을 수 있습니다. System.Xml 형식의 변수를 사용하여 이 작업을 수행할 수 있습니다 . XmlDocument 및 로드 또는 적절한 콘텐츠 생성 다음 예제에서는 XmlDocument의 LoadXml 메서드를 사용하여 문자열에서 XML을 로드합니다.
XmlVariable.LoadXml("<ns0:Root PONumber="047745351122111" xmlns:ns0="http://BTSHTTPSend.SimpleSchema"><MyChildRecord SubAttr1="Simple Attribute " /></ns0:Root>");
XLANGMessage XmlMsg = XmlVariable;
다음 예제에서는 XmlDocument의 Load 메서드를 사용하여 파일에서 XML을 로드합니다.
XmlVariable.Load("C:\MyData.xml");
XLANGMessage XmlMsg = XmlVariable;
참고
더 큰 메시지를 생성하려면 이전 섹션에서 설명한 스트리밍 방법 중 하나를 사용하거나 오케스트레이션 Designer 변환 셰이프를 사용하는 것이 좋습니다.
XLANGMessage 및 XLANGPart를 사용할 때의 고려 사항
사용자 코드에서 XLANGMessage 및 XLANGPart 를 사용하는 경우 다음을 고려합니다.
메시지 부분을 XLANGPart 인수로 전달하거나 XLANGPart 형식의 값을 반환하지 마세요. XLANGPart를 파트의 형식으로 전달해야 합니다. 예:
Message String msg; Class.Test(msg); // or you can do the following Messagetype mt { String part; }; Message mt msg; Class.Test(msg,part);
메시지 자체를 XLANGMessage로 전달하고 XLANGMessage 첨자 연산자를 사용하여 함수 호출 내의 부분에 액세스할 수도 있습니다. 그러나 함수 호출의 수명을 지나 수명이 연장되는 컬렉션에 XLANGPart 를 배치해서는 안 됩니다. 대신 컬렉션에 XLANGMessage 를 배치해야 합니다. 예:
void Test(XLANGMessage xlm) { try { XLANGPart xlp = xlm[0]; string sval = (string)xlp.RetrieveAs(typeof(string)); } finally { xlm.Dispose(); } }
오케스트레이션 매개 변수를 XLANGMessage 또는 XLANGPart로 정의하지 마세요. 메시지를 전달하려면 메시지 유형 매개 변수를 사용해야 합니다. 파트를 전달하려면 메시지를 전달한 다음 해당 파트를 사용합니다. 파트 값만 필요한 경우 해당 파트 유형을 사용하여 파트를 전달합니다.
메서드 호출에 대한 XLANGMessage 매개 변수를 반환하지 마세요. 전달된 XLANGMessage 매개 변수를 반환한 다음 메서드 호출 내의 매개 변수에서 Dispose 메서드를 호출할 수 없는 경우 수명 가정을 직관적으로 위반하고 예외도 throw합니다. XLANGMessage 매개 변수를 통해 사용자 코드에 메시지를 전달하는 경우 일반적으로 메시지를 참조하지 않는 특수 컨텍스트로 메시지를 참조합니다. 이 컨텍스트의 수명은 오케스트레이션 인스턴스의 수명입니다. 그 이유는 BizTalk Server에서 사용자 코드가 메시지를 보유할지 여부를 알 수 없기 때문입니다.
오케스트레이션 인스턴스가 종료되면 해당 인스턴스에서 생성된 모든 메시지는 더 이상 유효하지 않으므로 이러한 컬렉션의 수명은 해당 인스턴스의 수명보다 짧거나 같아야 합니다. 그러나 오케스트레이션 instance 동일한 수명을 가진 XLANGMessage 인수를 통해 메시지를 전달할 때 루프에서 메시지 참조를 해제하려는 경우 XLANGMessage.Dispose를 호출하여 참조를 해제할 수 있습니다. 또한 사용자 코드 메서드 내에서 XLANGMessage 매개 변수는 로컬로만 사용되며 매개 변수의 수명이 함수 호출의 수명에 포함된 경우 XLANGMessage.Dispose 를 호출하여 루트 컨텍스트에 대한 참조를 해제하고 해당 메시지에 정상적인 수명 동작을 다시 제공할 수도 있습니다. 예:
void Test(XLANGMessage xlm) { try { //XLANGMessage is only used locally } finally { xlm.Dispose(); } }
컬렉션에 xlm을 배치하는 경우 클래스 자체에 정리를 위한 Dispose 메서드가 있어야 합니다. 예:
public class A { Hashtable h = new Hashtable(); public void Test(XLANGMessage xlm) { h[xlm] = 1; } //You can have more methods here public void Dispose() { foreach (XLANGMessage xlm in h.Keys) { xlm.Dispose(); } } }
XLANGMessages 컬렉션을 마치면 A.Dispose를 호출합니다.