Quel est le pattern correct pour modifier la valeur Api.IsWeb ?

0000003312     -      20/08/2025

Api.IsWeb est une propriété statique qui permet de déterminer si le mode web, càd silencieux (donc sans boîte de dialogue), doit être activé. Par défaut, dans Mercator, cette propriété est à false. Et dans les applications web ou MercatorPenguinServer, elle est est à true. Cette propriété étant statique, elle est donc unique pour l'ensemble de l'AppDomain et pour tous les threads y fonctionnant. La modification de cette propriété doit être évitée, car dans la plupart des cas, elle n'est pas nécessaire.

La mettre à false sans précaution dans un customizer sans remettre correctement sa valeur initiale sera dommageable dans une application web ou MercatorPenguinServer, puisque ces derniers pourront voir leurs processus bloqués par des boîtes de dialogue intempestives.

La mettre à true pourrait avoir pour conséquence que Mercator desktop continue à fonctionner sans certaines boîtes de dialogues généralement attendues par l'utilisateur.

Il faut prendre en considération le fait qu'un customizer modifiant cette valeur peut évoluer dans les deux contextes : Mercator desktop et MercatorPenguinServer, ayant chacun une valeur par défaut d'Api.IsWeb différente.

Si la modification est vraiment requise, par exemple pour désactiver dans certaines circonstances l'affichage de boîtes de dialogue, il est obligatoire d'utiliser le pattern suivant :

Zoom
bool previousApiIsWeb = Api.IsWeb;
try
{
    Api.IsWeb = false ou true;
    ...
}
finally
{
    Api.IsWeb = previousApiIsWeb;
}

 

On notera le bloc try / finally qui fait que quelle que soit la façon de sortir du code sous try :

  • soit à cause d'un return se trouvant dans le code,
  • soit à cause d'une exception rencontrée,

le code dans finally sera toujours exécuté. 

L'utilisation du pattern décrit ci-dessus est obligatoire.


Dans le cas d'application multi-threads (par exemple les applications web), il est probablement nécessaire de mettre en place une protection contre les accès concurrents (simultanés) qui auraient besoin de l'autre valeur d'Api.IsWeb. Ceci peut être facilement mis en place via cette propriété statique unique pour l'ensemble du code :

Zoom
public static object lockApiIsWeb = new object();

et la mise en place du verrou dans le code :

Zoom
lock (lockApiIsWeb)
{
    bool previousApiIsWeb = Api.IsWeb;
    try
    {
        Api.IsWeb = false;
        ...
}
    finally
    {
        Api.IsWeb = previousApiIsWeb;
    }
}

Il faut noter que le code ci-dessus crée un système de file d'attente qui peut grever les performances de l'application.



Cookies fonctionnels : Cookies nécessaires à l'utilisation du site et cookies de préférence. Ils ne contiennent aucune donnée à caractère personnel. (En savoir plus)

Cookies statistiques : Captation de statistiques liées aux comportements des internautes. (En savoir plus)

Cookies marketing : Pour effectuer le suivi des visiteurs au travers des sites web, à des fins publicitaires. (En savoir plus)