Gestion des adresses IP des DynHost en C#

OVH permet à tous ses clients ayant un nom de domaine enregistré chez eux de créer des DynHost. Cette technologie permet de lier un sous-domaine à une adresse IP exemple : dynhost1.gmdevelopment.info correspond à l'adresse IP 123.123.123.123. C'est bien de créer un DynHost, mais lorsque l'adresse IP change, il faut la mettre á dans les enregistrements DynHost. OVH recommande deux logiciels pour le faire... Mais ils sont en licence Shareware (gratuit un temps puis payant). Je me suis alors dit "Je suis développeur. Pourquoi payer ?"

Pour mon logiciel, il me fallait d'abord m'informer sur l'API OVH.

Ensuite, j'avais besoin d'un Web Service qui vérifie l'adresse IP de l'ordinateur sur lequel tourne mon client de mise à jour DynHost.
Code PHP du Web Service :
<?php $ip = $_SERVER['REMOTE_ADDR'];
echo $ip; ?>
Et si l'on veut que la sortie soit au format JSON , le code PHP devient :
<?php $ip = array('ip' => $_SERVER['REMOTE_ADDR']);
echo json_encode($ip); ?>
Un moyen simple d'interroger ce service :
using (WebClient wc = new WebClient()) {
string NewIP = wc.DownloadString(url);
}

Une fois les codes d'authentification OVH obtenus, il suffit d'appeler la méthode UpdateIP(ZoneName, DynHostID) suivie de la méthode DnsRefresh(ZoneName) :
/*Cette méthode met à jour l'adresse IP du DynHost. Attention, il faut ensuite appeler DnsRefresh()*/
public string UpdateIP(string ZoneName, long DynHostID) {
string Query = "https://eu.api.ovh.com/1.0/domain/zone/ " + ZoneName + "/dynhost/record/ " + DynHostID;
HttpWebRequest Request = (HttpWebRequest) WebRequest.Create(Query);
Request.Method = "PUT";
Request.ContentType = "application/json";
string NewIP = WhatIsMyIP();
string JSON = "{\"ip\":\"" + NewIP + "\"}";
string Signature = CaculateSignature("PUT", Query, JSON, UnixTimeStamp);
SetRequestHeaders(Request, UnixTimeStamp, Signature);
string Response = string.Empty;
using(StreamWriter Writer = new StreamWriter(Request.GetRequestStream())) {
Writer.Write(JSON);
Writer.Flush();
Writer.Close();
}
using (StreamReader Reader = new StreamReader(Request.GetResponse().GetResponseStream())) {
Response = Reader.ReadToEnd();
}
return Response;
}

/*Cette méthode rafraîchit la zone DNS en vue de la propagation de la nouvelle adresse IP du DynHost.*/
public string DnsRefresh(string ZoneName) {
string Query = "https://eu.api.ovh.com/1.0/domain/zone/ " + ZoneName + "/refresh";
HttpWebRequest Request = (HttpWebRequest) WebRequest.Create(Query);
Request.Method = "POST";
/*Ici, le paramètre JSON de la Signature est une chaîne de caractères qui ne contient pas de données.*/
string Signature = CalculateSignature("POST", Query, "", UnixTimeStamp);
SetRequestHeaders(Request, UnixTimeStamp, Signature);
string Response = string.Empty;
using (StreamReader Reader = new StreamReader (Request.GetResponse().GetResponseStream()) {
Response = Reader.ReadToEnd();
}
return Response;
}