Contourner la logique métier personnalisée

Il peut arriver que vous souhaitiez pouvoir effectuer des opérations sur les données sans appliquer une logique métier personnalisée. Ces scénarios impliquent généralement des opérations de données en bloc où un grand nombre d’enregistrements sont créés, mis à jour ou supprimés.

En tant que développeur d’une application cliente, vous pouvez transmettre des paramètres facultatifs avec vos requêtes pour contrôler deux types de logique métier personnalisée, comme décrit dans le tableau suivant :

Type de logique Situations d’utilisation de
Mode synchrone Pour permettre à l’opération de données en masse d’être achevée aussi rapidement que possible. Contournez la logique synchrone lorsque les données que vous modifiez sont connues pour répondre aux exigences de l’organisation ou si vous avez un plan pour atteindre cette logique par d’autres moyens. Contournez toute logique synchrone personnalisée afin que chaque opération puisse se terminer plus rapidement, ce qui raccourcit la durée totale de l’opération en bloc.
Flux Power Automate Lorsqu’un grand nombre de tâches système créées pour prendre en charge les flux entraînent une sauvegarde dans Dataverse ce qui peut avoir un impact sur les performances. Vous pouvez atténuer ce problème de performances en ne déclenchant pas les flux lors de l’exécution d’opérations en masse.

Contourner la logique synchrone

Utilisez le paramètre facultatif BypassCustomPluginExecution pour contourner la logique synchrone personnalisée.

L’alternative à l’utilisation de ce paramètre facultatif consiste à localiser et à désactiver les plug-ins personnalisés qui contiennent la logique métier synchrone. Mais désactiver les plug-ins signifie que la logique est désactivée pour tous les utilisateurs pendant que ces plug-ins sont désactivés. Cela signifie également que vous devez veiller à ne désactiver que les bons plug-ins et ne pas oublier de les réactiver lorsque vous avez terminé.

Utiliser ce paramètre facultatif vous permet de désactiver les plug-ins synchrones personnalisés pour des requêtes spécifiques envoyées par une application configurée pour utiliser cette option.

Il y a deux conditions préalables :

  • Vous devez envoyer les requêtes à l’aide du paramètre facultatif BypassCustomPluginExecution.
  • L’utilisateur qui envoie les demandes doit avoir le privilège prvBypassCustomPlugins. Par défaut, seuls les utilisateurs ayant le rôle de sécurité Administrateur système disposent de ce privilège.

Notes

Le privilège prvBypassCustomPlugins n’est pas affectable dans l’interface utilisateur pour le moment. Vous pouvez ajouter un privilège à un rôle de sécurité en utilisant l’API. Pour plus d’informations : Ajout du privilège prvBypassCustomPlugins à un autre rôle

Que fait BypassCustomPluginExecution ?

Cette solution cible la logique métier synchrone personnalisée qui a été appliquée pour votre organisation. Lorsque vous envoyez des requêtes qui contournent la logique métier personnalisée, tous les plug-ins synchrones et les workflows en temps réel sont désactivés, sauf :

  • Les plug-ins qui font partie du système Microsoft Dataverse de base ou qui font partie d’une solution dont Microsoft est l’éditeur.
  • Les workflows inclus dans une solution dont Microsoft est l’éditeur.

Les plug-ins système définissent les comportements de base pour des entités spécifiques. Sans ces plug-ins, vous rencontreriez des incohérences de données qui pourraient être difficiles à corriger.

Les solutions fournies par Microsoft qui utilisent Dataverse, telles que Microsoft Dynamics 365 Customer Service ou Dynamics 365 Sales, incluent également une logique métier critique qui ne peut pas être contournée avec cette option.

Important

Vous avez peut-être acheté et installé des solutions d’autres éditeurs de logiciels indépendants (ISV) qui incluent leur propre logique métier. La logique synchrone appliquée par ces solutions sera contournée. Vous devez consulter ces éditeurs de logiciels indépendants avant d’utiliser cette option pour comprendre quel peut être l’impact de cette option avec des données utilisées par leurs solutions.

Comment utiliser l’option BypassCustomPluginExecution ?

Vous pouvez utiliser cette option avec l’API web ou le SDK pour .NET.

Il existe deux manières d’utiliser ce paramètre facultatif avec le SDK pour .NET.

Définir la valeur comme paramètre facultatif

L’exemple suivant définit le paramètre facultatif BypassCustomPluginExecution lors de la création d’un nouvel enregistrement de compte avec la catégorie CreatRequest.

static void DemonstrateBypassCustomPluginExecution(IOrganizationService service)
{
    Entity account = new("account");
    account["name"] = "Sample Account";

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("BypassCustomPluginExecution", true);
    service.Execute(request);
}

Vous pouvez utiliser cette méthode pour les opérations de données que vous lancez dans vos plug-ins lorsque l’utilisateur appelant a le privilège prvBypassCustomPlugins.

Définir la propriété CrmServiceClient.BypassPluginExecution

L’exemple suivant définit la propriété CrmServiceClient.BypassPluginExecution lors de la création d’un nouvel enregistrement de compte :

var service = new CrmServiceClient(connectionString);  

service.BypassPluginExecution = true;

var account = new Entity("account");
account["name"] = "Sample Account";

service.Create(account);

Étant donné que ce paramètre est appliqué au service, il restera défini pour toutes les requêtes envoyées à l’aide du service jusqu’à ce qu’il soit défini sur false.

Notes

Cette propriété n’est pas disponible dans le Dataverse.Client.ServiceClient, mais le reste dans les méthodes Dataverse.Client.Extensions.CRUDExtentions.

Ajout du privilège prvBypassCustomPlugins à un autre rôle

Comme le privilège prvBypassCustomPlugins n’est pas définissable dans l’interface utilisateur pour différents rôles de sécurité, si vous devez accorder ce privilège à un autre rôle de sécurité, vous devez utiliser l’API. Par exemple, vous souhaiterez peut-être accorder ce privilège à un utilisateur avec le rôle de sécurité Personnalisateur système.

Le privilège prvBypassCustomPlugins a l’identifiant 148a9eaf-d0c4-4196-9852-c3a38e35f6a1 dans toutes les organisations.

Associez le privilège prvBypassCustomPlugins au rôle de sécurité en utilisant la relation AddPrivilegesRoleRequest.

static void AddprvBypassCustomPluginsToRole(IOrganizationService service, Guid roleId)
{
    var request = new AddPrivilegesRoleRequest
    {
        RoleId = roleId,
        Privileges = new[]{
            new RolePrivilege{
                PrivilegeId = new Guid("148a9eaf-d0c4-4196-9852-c3a38e35f6a1"),
                Depth = PrivilegeDepth.Global
            }
        }
    };
    service.Execute(request);
}

Foire aux questions sur le contournement de la logique synchrone (FAQ)

Vous trouverez ci-dessous une foire aux questions sur l’utilisation du paramètre facultatif BypassCustomPluginExecution pour contourner la logique métier synchrone.

Est-ce que cela contourne les plug-ins pour les opérations de données effectuées par les plug-ins Microsoft ?

Non. Si un plug-in synchrone ou un workflow en temps réel d’une solution Microsoft exécute des opérations sur d’autres enregistrements, la logique de ces opérations n’est pas contournée. Seuls les plugins synchrones ou les workflows en temps réel qui s’appliquent à l’opération spécifique seront contournés.

Puis-je utiliser cette option pour les opérations de données que j’effectue dans un plug-in ?

Oui, mais uniquement lorsque le plug-in s’exécute dans le contexte d’un utilisateur qui a le privilège prvByPassPlugins. Pour les plug-ins, définissez le paramètre facultatif BypassCustomPluginExecution sur la classe dérivée de la classe OrganizationRequest. Vous ne pouvez pas utiliser les classes CrmServiceClient ou ServiceClient dans un plug-in.

Qu’en est-il des étapes de plug-in asynchrones, des workflows et des flux asynchrones ?

La logique asynchrone n’est pas contournée. La logique asynchrone ne contribue pas de manière significative au coût de traitement des enregistrements, elle n’est donc pas contournée par ce paramètre.

Contourner les flux Power Automate

Les flux Power Automate peuvent répondre aux événements Dataverse en utilisant les déclencheurs Lorsqu’une ligne est ajoutée, modifiée ou supprimée ou Lorsqu’une action est effectuée. Lorsque ces événements se produisent, Dataverse crée des tâches système pour exécuter ces flux.

Lorsqu’un programme ou un plug-in effectue des opérations en bloc, un grand nombre de tâches système peuvent être créées. Un grand nombre de tâches système peut entraîner des problèmes de performances pour Dataverse . Vous pouvez choisir de contourner la création de ces tâches système dans votre programme ou plug-in en utilisant le paramètre facultatif SuppressCallbackRegistrationExpanderJob.

La table CallbackRegistration gère les déclencheurs de flux, et une opération interne appelée expander crée les tâches système.

Notes

Lorsque cette option est utilisée, les propriétaires de flux ne reçoivent pas de notification indiquant que leur logique de flux a été contournée.

Quand contourner les flux Power Automate

Important

N’utilisez pas le paramètre facultatif SuppressCallbackRegistrationExpanderJob sauf si vous savez que les problèmes de performances que vous rencontrez sont dus à un grand nombre de tâches système spécifiques qui sont créées.

Les utilisateurs ont ajouté des flux pour des raisons professionnelles et ils ne doivent pas être contournés sans un examen attentif. Assurez-vous de tenir compte des stratégies d’atténuation mentionnées ci-dessous.

SuppressCallbackRegistrationExpanderJob vous aidera-t-il ?

Utilisez uniquement cette option si vous rencontrez des problèmes de performance après des opérations en bloc et si vous avez un grand nombre de tâches système CallbackRegistration Expander Operation avec un StatusCode défini sur 0 : Attendre les ressources.

Vous pouvez utiliser les requêtes suivantes pour obtenir des informations sur l’état de ces tâches.

Si le nombre total est supérieur à 50 000, ces requêtes renvoient l’erreur suivante.

Nom: AggregateQueryRecordLimitExceeded
Code : 0x8004E023
Nombre : -2147164125
Message : The maximum record limit is exceeded. Reduce the number of records.

Notes

Si les requêtes ne renvoient pas d’erreur, le nombre de tâches en file d’attente n’est probablement pas le problème. Généralement, le nombre de tâches en file d’attente dépasse 50 000 enregistrements avant que des problèmes de performances ne se produisent.

Les exemples suivants génèrent le nombre de tâches système opération de développement CallbackRegistration selon le code d’état. La valeur operationtype pour ce type de tâche système est 79.

static void RetrieveCallbackRegistrationExpanderStatus(IOrganizationService service)
{
    string fetchXml = @"<fetch aggregate='true'>
        <entity name='asyncoperation'>
        <attribute name='statuscode' alias='statuscode' groupby='true' />
        <attribute name='statuscode' alias='count' aggregate='count' />
        <filter>
            <condition attribute='operationtype' operator='eq' value='79' />
        </filter>
        </entity>
    </fetch>";

    FetchExpression fetchExpression = new(fetchXml);

    EntityCollection response = service.RetrieveMultiple(fetchExpression);

    foreach (Entity result in response.Entities)
    {
        string statusCode = result.FormattedValues["statuscode"];
        int count = (int)((AliasedValue)result["count"]).Value;
        Console.WriteLine($"{statusCode}: {count}");
    }
}

Sortie :

Canceled: 4101
Failed: 13
Waiting for Resources: 50,000

Comment contourner les flux Power Automate

La manière dont vous contournez les flux varie selon que vous utilisez le kit de développement logiciel (SDK) pour .NET ou l’API web.

Notes

Pour les opérations de données initiées dans les plug-ins, vous devez utiliser le SDK pour .NET.

Les exemples suivants créent un enregistrement de compte qui ne déclenchera pas Power Automate.

static void DemonstrateSuppressCallbackRegistrationExpanderJob(IOrganizationService service)
{
    Entity account = new("account");
    account["name"] = "Sample Account";

    CreateRequest request = new()
    {
        Target = account
    };
    request.Parameters.Add("SuppressCallbackRegistrationExpanderJob", true);
    service.Execute(request);
}

Stratégies d’atténuation

Les propriétaires de flux s’attendent à ce que leur logique soit exécutée. Les propriétaires de flux ne seront pas avertis que leur logique a été contournée lorsque vous utilisez cette option. Il est important de communiquer aux propriétaires de flux que la logique n’a pas été appliquée afin qu’ils sachent quand et pourquoi leur logique n’a pas été appliquée. Ils peuvent alors déterminer si ou comment appliquer leur logique.

Les utilisateurs peuvent créer des flux enfants contenant une logique pouvant être appelée par plusieurs déclencheurs, même manuellement. Si la logique est contenue dans un flux enfant, elle peut être déclenchée ultérieurement par d’autres moyens. Pour plus d’informations : Créer des flux enfants

Identifier les flux qui seront contournés

Vous ne pourrez peut-être pas identifier exactement les flux qui seront contournés. Vous pouvez interroger la table CallbackRegistration pour évaluer l’impact et qui contacter concernant leurs flux qui ne s’exécutent pas. La table suivante décrit certaines colonnes de la table CallbackRegistration qui sont utiles ;

Colonne Description
name Si cette valeur est une valeur GUID, elle doit correspondre à la valeur flowid et vous devez être en mesure de voir la définition du flux dans une URL avec cette valeur en l’ajoutant à cette URL : https://make.powerautomate.com/environments/<environmentid>/flows/<flowid>/details.
message Lorsque le flux utilise le déclencheur Lorsqu’une ligne est ajoutée, modifiée ou supprimée, il peut s’abonner à toutes les combinaisons d’opérations Create, Update et Delete avec ces options :
- 1 : Ajouté
-2 : Supprimé
-3 : Modifié
-4 : Ajouté ou modifié
-5 : Ajouté ou supprimé
- 6 : Modifié ou supprimé
-7 : Ajouté, modifié ou supprimé
sdkmessage Lorsque le flux utilise le déclencheur Lorsqu’une action est exécutée, cette colonne contient le nom du message.
scope Les flux s’appliquent uniquement à la portée spécifiée par l’utilisateur, telle que définie à l’aide de ces options :
- 1 : Utilisateur
-2 : BusinessUnit
-3 : ParentChildBusinessUnit
- 4 : Organisation
ownerid Le propriétaire de l’inscription du rappel et le flux.
softdeletestatus Si le flux est supprimé. 0 n’est pas supprimé. 1 est supprimé.

Les exemples de requêtes suivants renvoient ces valeurs :

static void RetrieveCallbackOperations(IOrganizationService service)
{

    QueryExpression callbackRegistrationQuery = new("callbackregistration")
    {
        ColumnSet = new ColumnSet("name", "entityname", "message", "sdkmessagename", "scope", "ownerid"),
        Criteria = new FilterExpression(LogicalOperator.And)
        {
            Conditions = {
                { new ConditionExpression("softdeletestatus",ConditionOperator.Equal,0) },
                // Add more conditions here to filter the results
            }
        }
    };

    EntityCollection callbackRegistrations = service.RetrieveMultiple(callbackRegistrationQuery);

    foreach (Entity callbackRegistration in callbackRegistrations.Entities)
    {
        string ownerid = callbackRegistration.FormattedValues["ownerid"];
        string scope = callbackRegistration.FormattedValues["scope"];
        string name = callbackRegistration.GetAttributeValue<string>("name");
        string message = callbackRegistration.FormattedValues["message"];
        string entityname = callbackRegistration.GetAttributeValue<string>("entityname");
        string sdkmessage = callbackRegistration.GetAttributeValue<string>("sdkmessagename");

        Console.WriteLine($"{ownerid},{scope},{name},{message},{entityname},{sdkmessage},");
    }
}

Sortie

FirstName LastName,Organization,de7153ba-9221-4079-82cc-c884bbd05dc0,Modified,account,,
FirstName LastName,Organization,Callback Registration Id: b44090aa-adde-4866-ac2e-d68fbcbe7d5a,Added,account,,
FirstName LastName,Organization,Callback Registration Id: dabfa1a1-b794-44d0-ad34-cd49ea650606,Added,none,sample_BusinessEvent,

Forum aux questions sur le contournement des flux Power Automate (FAQ)

Vous trouverez ci-dessous une foire aux questions sur l’utilisation du paramètre facultatif SuppressCallbackRegistrationExpanderJob pour contourner les flux Power Automate.

Les utilisateurs ont-ils besoin d’un privilège spécifique ?

Non Contrairement à Contourner la logique synchrone, aucun privilège spécial n’est requis.

Si mon application cliente utilise ce paramètre facultatif, les opérations effectuées par les plug-ins enregistrés pour l’opération l’appliqueront-elles également ?

Non Le paramètre n’est transmis à aucune opération effectuée par les plug-ins qui sont enregistrés pour les événements qui se produisent en raison des demandes de votre application cliente. Si vous souhaitez contourner les flux pour les opérations effectuées par les plug-ins, vous devez utiliser le paramètre facultatif SuppressCallbackRegistrationExpanderJob dans le code de votre plug-in.

Voir aussi

API web : Composer des demandes HTTP et traiter les erreurs
Utiliser des paramètres facultatifs

Notes

Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)

Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).