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é...![]()
Partager