通常、AS2 メッセージは HTTP アダプター経由で送信されます。 ただし、カスタム コンポーネントを作成する場合は、FILE アダプター経由で AS2 メッセージを送信できます。 このトピックでは、このようなソリューションがどのように機能するかについて説明し、ソリューションのサンプル コードを提供します。
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";