Senden einer AS2-Nachricht über einen Dateisendeport
AS2-Nachrichten werden normalerweise über einen HTTP-Adapter gesendet. Wenn Sie benutzerdefinierte Komponenten erstellen, können Sie AS2-Nachrichten aber auch über einen Dateiadapter senden. In diesem Thema wird beschrieben, wie eine solche Lösung funktioniert, und es steht ein Beispielcode für die Lösung zur Verfügung.
Wenn AS2-Nachrichten über HTTP gesendet werden, trägt der AS2-Encoder in der Sendepipeline die HTTP-Header (und AS2-Header), die zum Senden der Nachricht erforderlich sind, in die Kontexteigenschaft HTTP.UserHttpHeaders
ein. Diese Header werden entweder aus der vorhandenen Kontexteigenschaft HTTP.UserHttpHeaders
, aus separaten Kontexteigenschaften oder aus Vereinbarungseigenschaften (in dieser Rangfolge) übernommen. Der HTTP-Adapter im Sendeport schreibt die Header in die Nachricht und sendet die Nachricht über HTTP.
Wenn Sie anstelle eines HTTP-Adapters einen FILE-Adapter im Sendeport verwenden, werden die Headerwerte in der Kontexteigenschaft HTTP.UserHttpHeaders
nicht in die Nachricht geschrieben. Sie müssen eine benutzerdefinierte Pipelinekomponente erstellen, um die Header in HTTP.UserHttpHeaders
der Nachricht voranzustellen. Die Nachricht kann dann vom Dateiadapter in einem Ordner abgelegt werden, und es handelt sich dann um eine AS2-Nachricht, die die erforderlichen HTTP-Header enthält.
Sie müssen möglicherweise auch eine benutzerdefinierte Komponente erstellen, um zu gewährleisten, dass alle AS2-Header in der Kontexteigenschaft HTTP.UserHttpHeaders
enthalten sind. Sie können entweder eine benutzerdefinierte Orchestrierung oder eine benutzerdefinierte Pipelinekomponente vor dem AS2-Encoder erstellen, um die Kontexteigenschaften festzulegen, die vom AS2-Encoder zum Erstellen von HTTP.UserHttpHeaders
verwendet werden.
Schreiben von Headern in eine AS2-Nachricht
Um eine AS2-Nachricht zu generieren, die einen Dateiadapter statt eines HTTP-Adapters verwendet, fügen Sie eine benutzerdefinierte Pipelinekomponente nach dem AS2-Encoder in einer benutzerdefinierten AS2-Sendepipeline hinzu. Fügen Sie Code in die benutzerdefinierte Pipelinekomponente ein, mit dem die Header aus der Kontexteigenschaft HTTP.UserHttpHeaders
in die Nachricht geschrieben werden. Als Beispiel dafür dient der folgende Code:
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;
}
Höherstufen von AS2-Header-Kontexteigenschaften
Sie können AS2-Headereigenschaften entweder mit einer benutzerdefinierten Orchestrierung oder einer benutzerdefinierten Pipelinekomponente in den Kontext einer Nachricht höher stufen.
Zum Höherstufen von AS2-Headereigenschaften anhand einer benutzerdefinierten Pipelinekomponente, fügen Sie eine solche Komponente vor dem AS2-Encoder in einer benutzerdefinierten AS2-Sendepipeline hinzu. Sie können Code aus dem oben gezeigten Beispiel verwenden, um Header aus HTTP.UserHttpHeaders
in die Nachricht zu schreiben. Dazu müssen Sie allerdings die Read-Methode durch die Promote-Methode ersetzen und den Namen, Wert und Namespace der heraufzustufenden Kontexteigenschaft angeben.
Zum Höherstufen von AS2-Headereigenschaften anhand einer benutzerdefinierten Orchestrierung erstellen Sie eine Orchestrierung mit einem Dateiempfangsport, einer Form vom Typ Nachricht erstellen und einem Dateisendeport. Fügen Sie Code zur Form Nachricht erstellen hinzu, mit dem die höher gestuften Eigenschaften festgelegt werden, die die AS2-Header enthalten. Sie müssen der benutzerdefinierten Orchestrierung einen Verweis auf Microsoft.BizTalk.HttpTransport.dll
hinzufügen.
Die Namespaces für HTTP-Header sind http://schemas.microsoft.com/BizTalk/2003/http-properties
für Nicht-AS2-HTTP-Header und http://schemas.microsoft.com/BizTalk/2003/as2-properties
für AS2-Header.
Der folgende Beispielcode zeigt, wie AS2-Headereigenschaften in der Form Nachricht erstellen einer Orchestrierung höher gestuft werden. Mit diesem Code werden AS2-Header für eine MDN höher gestuft.
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";
Weitere Informationen
Entwickeln und Konfigurieren von BizTalk Server-AS2-Lösungen