Orchestration mit mehreren Empfangsports verknüpfen

Mit Hilfe der Biztalk Management Oberfläche ist es nur möglich, einen einzigen Empfangsport mit einer Orchestration zu verknüpfen. Hier ein Weg, wie man mehrere Empfangsports verknüpfen kann.

1) Legen Sie die Empfangsports mit eindeutigen und zum Projekt passenden Namen in der richtigen Biztalk Applikation an.

2) Legen Sie in der Orchestration einen neuen One Way Port an, bei welchem Sie Nachrichten empfangen können. Als Portbinding geben Sie bitte “Direkt” an. In diesem Beispiel müssen Sie angeben, dass die Verknüpfung via “Filter Expressions” durchgeführt wird.

3) Legen Sie in der Orchestration ein “Receive Shape” an, in dessen Eigenschaften müssen die Filter Expressions gepflegt werden. Hier geben Sie sämtliche unter 1) erstellten Empfangsports mit BTS.ReceivePortName an, z.B. (BTS.ReceivePortName == “ReceiveMsgPort1”) und verknüpfen die Einträge mit OR. Die resultierende Wert der Eigenschaft sollte dann in Visual Studio in etwa so aussehen: (BTS.ReceivePortName == “ReceiveMsgPort1”) (BTS.ReceivePortName == “ReceiveMsgPort2”)

Damit werden nun sämtliche Nachrichten aus der Messagebox, welche mit den oben definierten Empfangsports empfangen wurden, an die Orchestration weiter gegeben.

Basic Authentifizierung bei einem SOAP / Webservice Aufruf

Sie haben einen Webservice (via wsdl zur Verfügung gestellt), welchen Sie aufrufen müssen? Der Betreiber des Webservice hat Basic Authentifizierung / Basic Authentification als Zugriffsmethode eingestellt. Den Webservice haben Sie via “Webverweis hinzufügen” unter Visual Studio mit dem Namen “WebServiceName” hinzugefügt. Die generierte Klasse MyServiceClass ist eine abgeleitete Klasse von SoapHttpClientProtocol aus dem namespace System.Web.Services.Protocols. Auf diese Klassen haben Sie bei entsprechenden via wsdl bereitgestellten Definitionen keinen Zugriff.

Leider reicht es nicht aus, wenn Sie die Zugangsdaten auf folgende Art und Weise hinzufügen:

ICredentials creds;
creds = new NetworkCredential(username, password);
WebServiceName.MyServiceClass client = new WebServiceName.MyServiceClass();
client.Credentials = creds;
client.PreAuthenticate = true;

client.MyMethodCall();

Die Lösung:

Sie müssen zusätzlich eine neue Klassendatei dem Projekt hinzufügen, welche demselben namespace wie MyServiceClass beinhaltet, z.B. WebServiceNameExtended.cs. Als nächstes erstellen Sie eine abgeleitete Klasse von MyServiceClass, z.B. MyServiceClassExtended. In diese Klasse fügen Sie eine Methode GetWebRequest() ein, welche die Standardklasse aus System.Net überschreibt. Auf diese Weise wird jeder Request, welcher abgesendet wird abgeändert und im Header die angegebenen Credentials mitgegeben und zusätzlich die Basic Authentifizierung eingeführt.

Beispiel:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Net;
using System.Text;
using System.Web.Services.Protocols;

namespace WebServiceName
{
    public class MyServiceClassExtended : MyServiceClass
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = (WebRequest)base.GetWebRequest(address);

            if (request.PreAuthenticate)
            {
                NetworkCredential networkCredentials = request.Credentials.GetCredential(address, "Basic ");
                if (networkCredentials != null)
                {
                    byte[] credentialBuffer = new UTF8Encoding().GetBytes(networkCredentials.UserName + ":" + networkCredentials.Password);
                    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(credentialBuffer);
                }
                else
                {
                    throw new ApplicationException("No network credentials");
                }
            }

            return request;
        }
    }
}