Test Console für Dynamics 365 Plugins

In Dynamics 365 gibt es die Möglichkeit, die Standardfunktionalität um Plugins zu erweitern. CRM Plugins können ausgelöst werden durch:

  • Eine Benutzeraktion in der Dynamics 365 Benutzeroberfläche
  • Ereignisse, die vom Organisationsdienst oder der WebApi ausgelöst werden

Die Ausführung der Plugins kann dann auf zwei Arten erfolgen:

  • synchron: diese Plugins werden sofort und in einer bestimmten Reihenfolge ausgeführt
  • asynchron: diese Plugins werden vom Queue Agent ausgeführt und später vom async-Dienst ausgeführt
    Weitere Ereignisse werden synchron verarbeitet.

Um die Funktionalität des Plugins testen zu können gibt es wieder verschiedene Möglichkeiten:

  • Unit Tests
  • Updaten des Plugins (z.B. mittels XrmToolBox) und Testen auf der Entwicklungsumgebung
  • Test Console zum prüfen der Funktionalität

In diesem Beitrag, möchte ich kurz zeigen, wie eine Testconsole für Plugins im Dynamics 365 Kontext verwendet werden kann:

  • Erstellen einer Consolenanwendung mit .NET Framework 4.6+
  • Installation des NuGet Packages Microsoft.CrmSdk.XrmTooling.CoreAssembly

Beispielcode zum Abfragen eines OptionSet values:

internal class Program
{
    static void Main(string[] args)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

        string connectionString = "AuthType=x;url=x;ClientId=x;ClientSecret=x"

        var crmService = new CrmServiceClient(connectionString);

        var query = new QueryExpression("x")
        {
            // ... query expression
        };

        if (crmService.IsReady)
        {
            EntityCollection result = crmService.RetrieveMultiple(query);

            var optionSet = result.Entities.FirstOrDefault().GetAttributeValue<AliasedValue>("x").Value;

            int value = ((OptionSetValue)optionSet).Value;
        }
    }
}

Wenn man mit JWT Token arbeitet, kann es sein, dass es bei der Programmausführung zu einer Exception kommen kann:

AuthenticationException: Das Remotezertifikat ist laut Validierungsverfahren ungültig.

In diesem Fall hilft ein einfacher Trick zur Zertifikatvalidierung, um die Testconsole verwenden zu können. Wichtig ist, dass dieser Code nicht im Produktivsystem eingesetzt wird:

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateCertificate);

// ...

static bool ValidateCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
    return true;
}