Salut Oogver,
Message très intéressant par ça touche à pas mal de chose 
Bon déjà sur l’API REST le feedback est bon car oui après réflexion si les datas sont null ({}) alors on devrait pouvoir les omettre de l’URL sans lever d’erreur ! Je note donc cette remarque dans ma todo list pour les futures updates du serveur.
Concernant ton MC, tu as besoin d’appeler une adresse HTTP depuis ton package à partir d’un MC exposé dans Constellation. Je reviendrais ci-dessous sur une manière plus conventionnelle mais analysons ton code ci-dessus.
Tu exposes une méthode statique “Url” qui crée un Processus Windows avec comme “filename” l’URL à appeler. Dans ce cas, Windows, voyant le schème “http://” va chercher l’application liée à ce sheme, en gros le navigateur Web défini par défaut sur ton système.
Une fois trouvé, il va simplement lancer le process du navigateur avec en paramètre l’URL que tu veux ouvrir. Dans mon cas il lancera “chrome.exe” avec l’URL à appeler.
TU constates ensuite que ca marche en “debug” dans Visual Studio mais pas quand tu déploies ton package sur ta sentinelle !
C’est normal
En effet, tu lances le processus de ton navigateur Web (FF, Chrome ou autre) qui lui s’exécute au sein d’une session utilisateur avec une interface graphique ! Quand tu lances ton package en debug dans VS, ton package est lancé au sein de ta session Windows, pas de probleme on peut lancer le navigateur (tu le vois d’ailleurs se lancer visuellement!).
Par contre, si tu le déploie sur une sentinelle de ta Constellation, et pour être très précis, sur une sentinelle “Service”, le MC semble s’exécuter (car on voit passer ton WriteInfo(“Test”) dans la Console log) mais l’appel HTTP n’est pas fait !
En effet, une sentinelle service est un service Windows qui se lance avec le système et n’est pas lié à une session utilisateur !
Je cite :
Il existe deux types de sentinelle :
- La “Sentinel Service” : il s’agit d’un service compatible Windows et Linux qui tourne en arrière plan et permet de déployer des packages Constellation sans interface graphique.
- La “Sentinel UI” : il s’agit d’une application Windows s’exécutant au sein d’une session Windows et permettant de déployer des packages Constellation avec interface graphique (dit Package UI) ou encore des packages ayant besoin d’interagir avec la session de l’utilisateur.
(
https://developer.myconstellation.io/getting-started/ajouter-des-sentinelles/#Prerequis)
Donc dans le cas où tu déploies ton package sur une sentinelle service, ton package n’est pas lancé au sein de ta session utilisateur, il tourne véritablement en “background” et donc ne peut pas accéder à l’interface graphique et donc ne peut pas lancer un navigateur internet !
Pour que ton code ci-dessus fonctionne, il faut déployer ton package sur une “sentinelle UI”, c’est à dire une sentinelle qui s’exécute au sein d’une session utilisateur avec donc l’accès à l’interface graphique.
Et c’est toute la différence entre la sentinelle “Service” et “UI” : les deux ont exactement le même code, le même fonctionnement, c’est juste le container qui change ! Dans le cas de la sentinelle “Service”, elle s’exécute hors session utilisateur, on n’a donc pas besoin d’ouvrir une session pour que la sentinelle s’exécute et déploie les package, parfait pour les serveurs & co mais par contre, il n’a pas accès aux informations de session ou à l’UI de Windows.
A l’inverse la sentinelle UI s’execute au sein d’une session Windows, il faut donc qu’un utilisateur ouvre sa session Windows pour que la sentinelle puisse se lancer, mais une fois lancé, on peut déployer des packages ayant besoin d’interagir avec la session ou l’interface graphique, comme dans ton cas pour lancer un navigateur Web.
Ceci étant dit, ton code n’est pas optimal! En effet si tu cherches à lancer un appel HTTP il y a mieux que de lancer le processus de ton navigateur! Dans ton cas, ton code nécessite une sentinelle UI, donc une session utilisateur ouverte, et est de ce fait limité à Windows (ton package n’est pas déployable sur Linux) et de plus tu auras autant de fenêtre de ton navigateur ouverte sur ton poste que d’appel que tu lances depuis ton package !!! Aussi, tu n’as aucun contrôle, impossible d’obtenir la réponse de l’appel HTTP, on se contente juste de lancer le navigateur sur une URL sans avoir de retour ni de contrôle !
Ainsi pour lancer un appel HTTP depuis un package C#, le mieux est d’utiliser les classes dans System.Net.
Pour faire simple tu peux utiliser le WebClient. Par exemple :
[MessageCallback]
private void DemoAppelUrl(string url)
{
PackageHost.WriteInfo($"GET {url}");
WebClient wc = new WebClient();
string response = wc.DownloadString(url);
PackageHost.WriteInfo($"Reponse : {response}");
}
La méthode “DownloadString” permet d’exécuter un GET HTTP sur l’URL passée en paramètre et te retourne le contenu de la réponse HTTP !
Dans ton cas, tu es entrain de changer de chaîne sur ta livebox si j’ai bien cerné
Le décodeur TV te renverras un JSON de réponse contenant dans un objet “result” le code de réponse (0 si OK, 1 si erreur) et le message de la réponse (“OK” si le changement de chaine est effectué).
Tu pourrais donc aller plus loin en “parsant” le JSON de la réponse récupéré par le DownloadString.
Par exemple, ajoutons ces deux lignes :
dynamic objResponse = Newtonsoft.Json.JsonConvert.DeserializeObject(response);
PackageHost.WriteInfo($"Code de retour de la Livebox : {objResponse.result.responseCode} - Message: {objResponse.result.message}");
On parse le retour de ton décodeur et on affiche le “responseCode” et “message” de la LB.
Le WebClient est très simple a prendre en main mais n’est pas super complet (gestion fine de la requête, headers, cookie & co) et aussi n’est pas thread-safe (si deux appels simultanés à ton MC ca lèvera une erreur). C’est pourquoi pour aller plus loin j’utilise plutôt les “HttpWebRequest” !
Très complet mais plus compliqué à utiliser pour un néophyte : https://www.codeproject.com/Articles/6554/How-to-use-HttpWebRequest-and-HttpWebResponse-in-N.
A titre d’exemple, deux packages utilisants des HttpWebRequest :
Et un autre package, celui “FreeboxTV” créé par Gio et Hydro qui lui utilise les WebClients : https://github.com/myconstellation/constellation-packages/blob/master/FreeboxTV/FreeboxTV/Remote/HttpFreeRemoteController.cs
Pour finir, ton message m’a inspiré pour connecter mon décodeur Orange TV
J’ai donc écris hier soir un package pour intégrer le décodeur TV Orange dans Constellation. Je publie le package prochainement sur le store 