Share via


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