Bonjour,

Je travaille sur un PlugIn pour une application Web qui est codée en C# avec le Framework 4.8

J'ai besoin à un moment d'appeler une API REST pour récupérer des informations afin de compléter la saisie d'un utilisateur lorsqu'il enregistre ses données :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.XPath;
 
// Aurea.CRM libraries
using update.Lib.ComponentModel;
using update.Lib.Contracts.Services;
using update.Lib.Extensions;
using update.Web.Base.Extensions;
using update.Crm.Contracts.Events;
using update.Lib.Contracts.Events;
using update.Lib.Logging;
using System.Security.Policy;
using update.Crm.Core.Contracts;
using data = update.Crm.Contracts.Data;
using update.Crm.Extensions;
 
// INSEE API
using MySirene;
using MySirene.INSEE;
 
namespace AureaDemoPlugIn
{
    public class SirenePlugIn : PlugInBase
    {
        /// <summary>
        /// Constructor
        /// </summary>
        public SirenePlugIn()
        {
        }
 
        /// <summary>
        ///  Initialize the PlugIn
        /// </summary>
        /// <param name="settingsNavigator"></param>
        protected override void Init(XPathNavigator settingsNavigator)
        {
            var events = Services.Get<IEventHub>();
            events.StartObserving<UpdateEventArgs>("/InfoAreas/FI/PreUpdate", OnCompanyChange);
        }
 
        /// <summary>
        /// Dispose & Unregister services
        /// </summary>
        /// <param name="isDisposing"></param>
        protected override void Dispose(bool isDisposing)
        {
            var events = Services.Get<IEventHub>();
            events.StopObserving<UpdateEventArgs>("/InfoAreas/FI/PostUpdate", OnCompanyChange);
        }
 
        public static void OnCompanyChange(object sender, UpdateEventArgs args)
        {
            const int FI_NANE = 2;
            const int FI_SYNONYM = 3;
            const int FI_PHONE = 15;
            const int FI_SIRET = 61;
 
            LogFacility f = new LogFacility("AureaDemoPlugIn");
            Log.Current.Debug(f, $"A company was changed. It's uid is {args.BusinessObject.Uid}.");
 
            // SIRET change
            if (args.BusinessObject.FieldIds.Contains(FI_SIRET))
            {
 
                Sirene sirene = new Sirene("****", "****");
                //Siret siret = await sirene.GetSiret(numeroSiret); <== marche pas !
                Task<Siret> tSiret = sirene.GetSiret(numeroSiret);
                tSiret.Wait();                            // <= reste bloqué ici (à priori)
                Siret siret = tSiret.Result;
 
                args.BusinessObject.Set(FI_NANE, siret.etablissement.uniteLegale.denominationUniteLegale);
            }
        }
    }
}

Si je mets le Siret siret = await sirene.GetSiret(numeroSiret); avec un async en dans le event handler OnCompanyChange j'ai une erreur qui me dit qu'on peut pas faire de l'async en ASP.NET à moins de mettre Async="true" dans la déclaration de la page ASPX.
Sauf que j'ai pas la main sur l'ASPX, et je ne maîtrise pas les effets de bord potentiels.

En revanche, le code ci-dessus, qui correspond à ma tentative de contournement, reste bloqué, je pense sur le tSiret.Wait();
Comment m'en sortir ?

Toutes les librairies REST/JSON on leurs méthodes synchrones deprecated, je suis donc obligé d'utiliser les méthodes async... Ou alors utiliser de vieilles versions pleines de trous de sécurité...