FILE 送信ポートを使用した AS2 メッセージの送信
通常、AS2 メッセージは HTTP アダプターを介して送信されます。 ただし、カスタム コンポーネントを作成する場合は、AS2 メッセージを FILE アダプター経由で送信できます。 このトピックでは、このようなソリューションのしくみについて説明し、ソリューションのサンプル コードを示します。
AS2 メッセージが HTTP 経由で送信されると、送信パイプラインの AS2 エンコーダーは、メッセージの送信に必要な HTTP (および AS2) ヘッダーを HTTP.UserHttpHeaders
コンテキスト プロパティに挿入します。 これらのヘッダーは、既存の HTTP.UserHttpHeaders
コンテキスト プロパティ、別のコンテキスト プロパティ、またはアグリーメント プロパティから (この優先順位で) 取得されます。 送信ポートの HTTP アダプターは、これらのヘッダーをメッセージに書き込み、HTTP 経由でメッセージを送信します。
送信ポートの HTTP アダプターの代わりに FILE アダプターを使用する場合、HTTP.UserHttpHeaders
コンテキスト プロパティのヘッダー値は、メッセージに書き込まれません。 HTTP.UserHttpHeaders
のヘッダーをメッセージの前に付けるためのカスタム パイプライン コンポーネントを作成する必要があります。 こうすることにより、メッセージは FILE アダプターによってフォルダーに追加でき、必要な HTTP ヘッダーが含まれた AS2 メッセージになります。
すべての AS2 ヘッダーが HTTP.UserHttpHeaders
コンテキスト プロパティに含まれるようにするためにも、カスタム コンポーネントの作成が必要になる場合があります。 カスタム オーケストレーションまたはカスタム パイプライン コンポーネントを AS2Encoder の前に作成すると、AS2 エンコーダーによって HTTP.UserHttpHeaders
を構築するために使用されるコンテキスト プロパティを設定できます。
AS2 メッセージへのヘッダーの書き込み
HTTP アダプターではなく FILE アダプターを使用して AS2 メッセージを生成するには、カスタムの AS2 送信パイプラインで AS2 エンコーダーの後にカスタム パイプライン コンポーネントを追加します。 HTTP.UserHttpHeaders
コンテキスト プロパティのヘッダーをメッセージに書き込むコードを、このカスタム パイプライン コンポーネントに追加します。 サンプル コードは次のとおりです。
public IBaseMessage Execute(IPipelineContext pContext, IBaseMessage pInMsg)
{
IPipelineContext pipelineContext = pContext;
IBaseMessage baseMessage = pInMsg;
//Prepend Headers
MemoryStream ms = new MemoryStream();
string strName = "UserHttpHeaders";
string strValue = (string)baseMessage.Context.Read(strName,
"http://schemas.microsoft.com/BizTalk/2003/
http-properties");
//Leave an empty line between the headers and the body
strValue += "\r\n";
ms.Write(Encoding.ASCII.GetBytes(strValue), 0,
Encoding.ASCII.GetByteCount(strValue));
//Append Body
Stream sr = baseMessage.BodyPart.Data;
//Read the body of the message and append it to the memory
stream containing the headers
int size = 1024;
byte[] buffer = new byte[size];
while (0 != (size = sr.Read(buffer, 0, buffer.Length)))
{
ms.Write(buffer, 0, size);
}
//Set the body of the message to the new memory stream
baseMessage.BodyPart.Data = ms;
//Rewind the stream
ms.Seek(0, SeekOrigin.Begin);
return baseMessage;
}
AS2 ヘッダー コンテキスト プロパティの昇格
カスタム オーケストレーションまたはカスタム パイプライン コンポーネントを使用すると、AS2 ヘッダーのプロパティをメッセージのコンテキストに昇格できます。
カスタム パイプライン コンポーネントを使用して AS2 ヘッダー プロパティを昇格するには、カスタムの AS2 送信パイプラインで AS2 エンコーダーの前にカスタム パイプライン コンポーネントを追加します。 HTTP.UserHttpHeaders
からメッセージにヘッダーを書き込むには、上記のサンプル コードを使用できます。ただし、Read メソッドを Promote メソッドで置き換えて、昇格するコンテキスト プロパティの名前、値、および名前空間を指定する必要があります。
カスタム オーケストレーションを使用して AS2 ヘッダー プロパティを昇格するには、FILE 受信ポート、メッセージの構築図形、および FILE 送信ポートを使用してオーケストレーションを作成します。 メッセージの構築図形には、AS2 ヘッダーが含まれた昇格対象プロパティを設定するコードを追加します。 カスタム オーケストレーションに Microsoft.BizTalk.HttpTransport.dll
への参照を追加する必要があります。
HTTP ヘッダーの名前空間は非 AS2 HTTP ヘッダーの場合は http://schemas.microsoft.com/BizTalk/2003/http-properties
であり、AS2 ヘッダーの場合は http://schemas.microsoft.com/BizTalk/2003/as2-properties
です。
次のサンプル コードに、オーケストレーションのメッセージの構築図形で AS2 ヘッダー プロパティを昇格する方法を示します。 このコードでは、MDN の AS2 ヘッダーが昇格されます。
Message_2=new System.Xml.XmlDocument();
Message_2=Message_1;
Message_2(EdiIntAS.IsAS2PayloadMessage)=false;
Message_2(EdiIntAS.IsAS2AsynchronousMdn)=true;
Message_2(EdiIntAS.IsAS2MdnResponseMessage)=true;
Message_2(EdiIntAS.SendMDN)=true;
Message_2(EdiIntAS.IsAS2MessageSigned)=false;
Message_2(EdiIntAS.AS2To)="Party1";
Message_2(EdiIntAS.AS2From)="Home";
Message_2(EdiIntAS.MessageId)="123456";
Message_2(EdiIntAS.OriginalMessageId)="2123456";
Message_2(HTTP.UserHttpHeaders)="Message1-Id: xyz\r\nMyHeader: MyValue";