문제

동적 포트를 구성하기 위한 일반 비즈톡 응용 프로그램을 개발하려고 합니다.각 포트에 대한 모든 구성 설정을 다시 가져 오는 오케스트레이션이 있으며 이러한 설정을 반복하고 포트를 구성하려고합니다.예를 들어,두 개의 속성은 포트 이름과 주소입니다.그래서 오케스트레이션 내에서 문자열 변수 포트 이름으로 포트를 참조하고 싶습니다.오케스트레이션의 모든 포트 컬렉션을 가져 오거나 문자열 변수를 통해 포트를 참조 할 수있는 방법이 있습니까 Port['MyPortName'](Microsoft.XLANGs.BaseTypes.Address) = "file://c:\test\out\%MessageId%.xml" 감사

도움이 되었습니까?

해결책

우선 오케스트레이션을 사용하여 이와 같은 구성 변경을 시도해서는 안 됩니다.기술적으로 당신이 하려고 하는 것을 할 수 있지만,연습으로 당신은 관리와 비즈니스 프로세스를 혼합 하지 말아야.

이러한 작업을 수행하는 가장 좋은 방법은 일반 스크립트 또는 파워 셸을 작성하는 것입니다.

당신이 원하는 데이터를 얻을 수 있습니다. http://msdn.microsoft.com/en-us/library/microsoft.biztalk.explorerom.btsorchestration_members(v=bts.20)

다른 팁

오케스트레이션 내에서 동적 논리 송신 포트를 동적으로 구성하려면 설정을 영구 데이터스토어에 저장해야 합니다.데이터베이스 또는 구성 파일)을 작성하고 런타임에 이러한 속성을 동적으로 할당하는 방법을 구현합니다.

그러나 먼저 동적 송신 포트를 구성 할 때 무슨 일이 일어나고 있는지 이해해야합니다.

동적 논리 송신 포트를 구성하는 방법

동적 논리 송신 포트의 속성 구성 오케스트레이션 내에서 두 단계가 포함됩니다:

  • 첫째, 운송 유형 및 대상 주소 송신 포트에서 속성을 지정해야 합니다.이것은 보통 표현 모양 이와 비슷한 코드로:

    다이내믹 엔드포트(마이크로소프트.랭기본형파일 형식;다이내믹 엔드포트(마이크로소프트.랭기본형주소)="C: emp\Folder\%SourceFileName%";

  • 둘째,보내는 메시지 자체의 컨텍스트에 추가 전송 속성을 지정해야 합니다.거의 모든 비즈톡 어댑터는 추가 속성 이는 메시징 엔진과 오케스트레이션 엔진 간의 통신에 사용됩니다.예를 들어, 수신 파일 이름 컨텍스트 속성은 파일 어댑터가 보내는 메시지를 대상 위치에 저장할 때의 특정 이름을 동적으로 설정하는 데 사용됩니다.이것은 최고의 내부 수행 할당 모양,보내는 메시지를 구성하는 일환으로:

    외출 메시지(파일.파일 이름)="하드 코드 파일 이름."

대부분의 구성 속성은 네임스페이스 접두사를 지정하여 보내는 메시지의 컨텍스트에서 지정해야 합니다(예:파일),속성 이름(예:받는 파일 이름)과 분명히 해당 속성에 할당되는 값입니다.

사실,모든 컨텍스트 속성은 잘 알려진 Microsoft.BizTalk.GlobalPropertySchemas.dll 조립.이것은 비주얼 스튜디오의 개체 탐색기에서 이 어셈블리를 검색하여 확인할 수 있습니다.

FILE.ReceivedFileName in Microsoft.BizTalk.GlobalPropertySchemas.dll

동적 논리 송신 포트를 구성하는 데 필요한 대부분의 컨텍스트 속성이 이 특정 어셈블리 내에 있지만 모든 컨텍스트 속성이 해당되는 것은 아닙니다.예를 들어,컨텍스트 속성을 저장하기 위해 별도의 어셈블리를 사용합니다.분명히 타사 또는 사용자 정의 어댑터에는 추가 어셈블리도 함께 제공됩니다.

따라서 아래에서 설명하는 것과 같은 유연한 접근 방식을 사용하여 동적 송신 포트에 컨텍스트 속성을 설정하려면 네 가지 정보가 필요합니다.:

  • 컨텍스트 속성 클래스가 포함된 어셈블리의 정규화된 이름입니다.
  • 네임스페이스 접두사.
  • 속성 이름입니다.
  • 속성 값입니다.

영구 매체에 포트 설정 저장

다음.포트 설정을 직렬화하기 위한 한 가지 가능한 구조를 보여 줍니다.

ContextProperties XML Schema Definition

이 경우,지정된 컨텍스트 속성은 매우 쉽게 데이터베이스 또는 구성 파일에 저장될 수 있습니다.예를 들어,이 게시물의 예제로 사용되는 설정은 다음과 같습니다:

Example of ContextProperties Settings

동적 논리 송신 포트 구성에 대한 유연한 접근 방식

간단한 도우미 라이브러리를 사용하면 동적 포트 구성을 설정하는 것이 매우 쉽습니다.먼저 영구 매체에서 직렬화된 설정을 검색해야 합니다.이 작업은 어댑터와 간단한 저장 프로시저를 사용하여 쉽게 수행 할 수 있습니다.

일단 검색되면,그 속성들은 강력하게 형식화된 씨#객체 그래프로 역직렬화될 수 있습니다.이를 위해 먼저 다음 명령줄 유틸리티를 사용하여 위에 표시된 컨텍스트 속성 스키마의 표현을 만듭니다:

xsd.exe /classes /language:cs /namespace:Helper.Schemas .\ContextProperties.xsd

이렇게 하면 다음 메서드를 사용하여 개선할 수 있는 부분 클래스가 생성됩니다:

namespace Helper.Schemas
{
    public partial class ContextProperties
    {
        public static ContextProperties Deserialize(string text)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                byte[] buffer = Encoding.UTF8.GetBytes(text);
                stream.Write(buffer, 0, buffer.Length);
                stream.Seek(0, SeekOrigin.Begin);
                return (ContextProperties) 
                    Deserialize(
                          stream
                        , typeof(ContextProperties));
            }
        }

        public static Object Deserialize(Stream stream, Type type)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(type);
            return xmlSerializer.Deserialize(stream);
        }
    }
}

두 번째,이 구성을 적용하려면 코드에서 메시지를 만들고 리플렉션을 사용하여 컨텍스트 속성을 동적으로 설정하는 것이 포함됩니다.

이를 위해 나는 빌린 기술을 사용합니다 파올로 살바토리의 기사 시리즈 동적 변환에 관하여,사용자 정의를 만드는 것으로 구성됩니다. 웹 사이트-파생 클래스,내부적으로 사용 비즈 토크 엑슬랑/에스 엔진.

namespace Helper.Schemas
{
    using Microsoft.BizTalk.XLANGs.BTXEngine; // Found in Microsoft.XLANGs.BizTalk.Engine
    using Microsoft.XLANGs.Core; // Found in Microsoft.XLANGs.Engine

    [Serializable]
    public sealed class CustomBTXMessage : BTXMessage
    {
        public CustomBTXMessage(string messageName, Context context)
            : base(messageName, context)
        {
            context.RefMessage(this);
        }

        public void SetContextProperty(string assembly, string ns, string name, object value)
        {
            if (String.IsNullOrEmpty(ns))
                ns = "Microsoft.XLANGs.BaseTypes";
            if (String.IsNullOrEmpty(assembly))
                assembly = "Microsoft.BizTalk.GlobalPropertySchemas";

            StringBuilder assemblyQualifiedName = new StringBuilder();
            assemblyQualifiedName.AppendFormat("{0}.{1}, {2}", ns, name, assembly);

            Type type = Type.GetType(assemblyQualifiedName.ToString(), true, true);
            SetContextProperty(type, value);
        }

        internal void SetContextProperty(string property, object value)
        {
            int index = property.IndexOf('.');
            if (index != -1)
                SetContextProperty(String.Empty, property.Substring(0, index), property.Substring(index + 1), value);
            else
                SetContextProperty(String.Empty, String.Empty, property, value);
        }

    }
}

이제 퍼즐의 마지막 부분은 오케스트레이션 내에서 이 사용자 지정 클래스를 사용하는 방법입니다.이것은 쉽게 할당 모양 다음 도우미 코드 사용:

namespace Helper.Schemas
{
    using Microsoft.XLANGs.BaseTypes;
    using Microsoft.XLANGs.Core; // Found in Microsoft.XLANGs.Engine

    public static class Message
    {
        public static XLANGMessage SetContext(XLANGMessage message, ContextProperties properties)
        {
            try
            {
                // create a new XLANGMessage

                CustomBTXMessage customBTXMessage = new CustomBTXMessage(message.Name, Service.RootService.XlangStore.OwningContext);

                // add parts of the original message to it

                for (int index = 0; index < message.Count; index++)
                    customBTXMessage.AddPart(message[index]);

                // set the specified context properties

                foreach (ContextPropertiesContextProperty property in properties.ContextProperty)
                    customBTXMessage.SetContextProperty(property.assembly, property.@namespace, property.name, property.Value);

                return customBTXMessage.GetMessageWrapperForUserCode();
            }

            finally
            {
                message.Dispose();
            }
        }
    }
}

이 정적 메서드를 내부 에서 사용할 수 있습니다 할당 모양 [잡담][잡담][잡담][잡담] OutboundMessage 컨텍스트를 설정할 메시지를 나타냅니다:

OutboundMessage = Helper.Schemas.Message.SetContext(OutboundMessage, contextProperties);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top