FAQ C#Consultez toutes les FAQ
Nombre d'auteurs : 41, nombre de questions : 274, dernière mise à jour : 27 mai 2018 Ajouter une question
Cette FAQ a été réalisée pour répondre aux questions les plus fréquemment posées concernant C# sur le forum Développement DotNET
Je tiens à souligner qu'elle ne garantit en aucun cas que les informations qu'elle contient sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .
Sur ce, je vous souhaite une bonne lecture.
Commentez cette FAQ : Commentez
- 6.1. Windows Communication Foundation (3)
- Comment obtenir les adresses IP d'un ordinateur ?
- Comment vérifier la validité d'une adresse IP ?
- Comment envoyer un mail par SMTP ?
- Comment télécharger et afficher le contenu d'une page web ?
- Comment savoir si mon PC est connecté à internet ?
- Comment vérifier si une machine est accessible ?
- Comment connaître la liste des adresses Ip de la machine ?
- Comment récupérer la liste des ordinateurs connectés au réseau ?
- Comment récupérer le contenu d'une page Web ?
- Comment appeler une méthode Web sans attendre de réponse du serveur ?
Pour obtenir les adresses IP d'un ordinateur on utilise la fonction Resolve de la Classe System.Net.Dns
Voici une petite fonction qui le fait. Pour avoir les adresses IP de l'ordinateur local il suffit de l'appeler sans paramètre.
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | using System.Net; string[] GetIPaddresses(string computername) { string[] saddr = null; IPAddress[] addr = Dns.Resolve(computername).AddressList; if (addr.Length > 0) { saddr = new String[addr.Length]; for (int i = 0; i < addr.Length; i++) saddr[i] = addr[i].ToString(); } return saddr; } |
Avec la méthode IPAddress.TryParse
Code c# : | Sélectionner tout |
1 2 3 4 5 | public bool CheckIpAddr(string ipAddress) { IPAddress ip; return System.Net.IPAddress.TryParse(ipAddress, out ip); } |
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public bool CheckIpAddr(string ipAddress) { string[] parts = ipAddress.Split('.'); if (parts.Length != 4) return false; foreach(string part in parts) { byte n; if (!byte.TryParse(part, out n)) return false; } return true; } |
Version 1.0 et 1.1
Il faut ajouter à son projet la référence System.Web.Mail (qui aurait dû s'appeler System.Net.Mail à mon avis).
Ensuite ça se fait tout seul. Exemple:
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | static void Main(string[] args) { // Objet mail MailMessage msg = new MailMessage(); // Expéditeur (obligatoire) msg.From = "expediteur@free.f"; // destinataire (il en faut au moins un) msg.To = "atoi@free.fr;alui@free.fr"; // destinataires en copie (facultatif) msg.Cc = "encoreatoi@free.fr"; // Texte du mail (facultatif) msg.Body = "Bonjour\n" + "Ceci est le contenu du mail\n" + "A bientôt"; // Fichier joint si besoin (facultatif) msg.Attachments.Add(new MailAttachment(@"c:\fichierjoint.txt", MailEncoding.UUEncode)); // Serveur SMTP SmtpMail.SmtpServer = "smtp.nerim.fr"; // Envoi du mail SmtpMail.Send(msg); } |
N'hésitez pas à consulter MSDN sur la classe System.Web.Mail.MailMessage. Elle dispose de nombreuses autres propriétés.
Il y a aussi l'excellent article de Webman
Version 2.0
A partir de .NET 2.0, les classes du namespace System.Web.Mail ont été rendues obsolètes, et remplacées par de nouvelles classes dans le namespace System.Net.Mail. Il est désormais recommandé d'utiliser ces classes à la place des anciennes. Elles s'utilisent presque de la même façon, mais offrent plus de fonctionnalités. L'envoi du message se fait à l'aide de la classe SmtpClient.
Voici un exemple :
Code c# : | Sélectionner tout |
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 | //... using System.Net; using System.Net.Mail; //... [STAThread] static void Main(string[] args) { // Objet mail MailMessage msg = new MailMessage(); // Expéditeur (obligatoire). Notez qu'on peut spécifier le nom msg.From = new MailAddress("john.doe@gmail.com", "John Doe"); // Destinataires (il en faut au moins un) msg.To.Add(new MailAddress("jack.sparrow@blackpearl.com", "Jack Sparrow")); msg.To.Add(new MailAddress("agent.smith@matrix.com", "Agent Smith")); // Destinataire(s) en copie (facultatif) msg.Cc.Add(new MailAddress("wonder.woman@superhero.com", "Wonder Woman")); // Texte du mail (facultatif) msg.Body = "Bonjour\n" + "Ceci est le contenu du mail\n" + "A bientôt"; // Fichier joint si besoin (facultatif) msg.Attachments.Add(new Attachment(@"c:\fichierjoint.txt")); // Envoi du message SMTP SmtpClient client = new SmtpClient("smtp.gmail.com", 587); client.EnableSsl = true; client.Credentials = new NetworkCredentials("john.doe@gmail.com", "mon_mot_de_passe"); // Envoi du mail client.Send(msg);} |
Enfin, notez qu'il est possible de spécifier les paramètres du serveur dans le fichier de configuration de l'application (web.config ou app.config) :
Code xml : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <configuration> <system.net> <mailSettings> <smtp deliveryMethod="network"> <network host="smtp.domaine.com" port="25" userName="mon_login" password="mon_mot_de_passe" /> </smtp> </mailSettings> </system.net> </configuration> |
N'hésitez pas à consulter ce tutoriel sur l'envoi et la réception d'emails en .NET 2.0.
On utilise les classes HttpWebRequest, HttpWebResponse qui encapsulent la communication socket du protocole HTTP. On utilise ensuite la classe StreamReader pour lire le flux de la réponse.
Namespaces à utiliser
Code c# : | Sélectionner tout |
1 2 | using System.Net; using System.IO; |
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | private void button1_Click(object sender, System.EventArgs e) { HttpWebResponse HttpWResponse = null; StreamReader sr = null; try { HttpWebRequest HttpWRequest = (HttpWebRequest)WebRequest.Create(textBox1.Text); HttpWResponse = (HttpWebResponse)HttpWRequest.GetResponse(); sr = new StreamReader(HttpWResponse.GetResponseStream()); richTextBox1.Text = sr.ReadToEnd(); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { if (HttpWResponse != null) HttpWResponse.Close(); if (sr != null) sr.Close(); } } |
On se sert de la fonction InternetGetConnectedState de la dll win32 wininet.dll
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | using System.Runtime.InteropServices; // Déclaration de l'API [DllImport("wininet.dll")] public extern static bool InternetGetConnectedState( out int Description, int ReservedValue ) ; // Utilisation de l'API public static bool IsConnected() { int Desc ; return InternetGetConnectedState( out Desc, 0 ) ; } |
Avec la version 2 du Framework, la classe Ping est apparue permettant de faire la même chose que la commande ping utilisée sous Dos :
Code c# : | Sélectionner tout |
1 2 3 4 5 | // Pinguer un machine Ping monPing = new Ping(); PingReply Reply = monPing.Send("192.168.1.31"); Console.WriteLine("Statut du ping : {0}", Reply.Status); |
Veillez toutefois à activer NetworkInformationPermission pour votre application, sans cela vous obtiendrez une exception de sécurité SecurityException
La classe IPHostEntry permet de connaître la liste de IP via la propriété AddressList :
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | // Nom de la machine String NomMachine = Dns.GetHostName(); // Récupération de la liste des IP de la machine IPHostEntry InfoIps = Dns.GetHostEntry(NomMachine); IPAddress[] MesIp = InfoIps.AddressList; foreach (IPAddress CurrentIp in MesIp) Console.WriteLine("Ip : {0}", CurrentIp.ToString()); |
Code c# : | Sélectionner tout |
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 | class Program { [StructLayout(LayoutKind.Sequential)] public struct _SERVER_INFO_100 { internal int sv100_platform_id; [MarshalAs(UnmanagedType.LPWStr)] internal string sv100_name; } [DllImport("Netapi32", SetLastError = true), SuppressUnmanagedCodeSecurityAttribute] public static extern int NetApiBufferFree(IntPtr pBuf); [DllImport("Netapi32", CharSet = CharSet.Auto, SetLastError = true), SuppressUnmanagedCodeSecurityAttribute] public static extern int NetServerEnum( string ServerNane, int dwLevel, ref IntPtr pBuf, int dwPrefMaxLen, out int dwEntriesRead, out int dwTotalEntries, int dwServerType, string domain, out int dwResumeHandle ); const int LVL_100 = 100; const int MAX_PREFERRED_LENGTH = -1; const int SV_TYPE_WORKSTATION = 1; const int SV_TYPE_SERVER = 2; /// <summary> /// Cette fonction est tirée d'une source trouvée ici => http://www.codeproject.com/cs/internet/ListNetworkComputers.asp /// </summary> public static string[] GetComputers() { ArrayList computers = new ArrayList(); IntPtr buffer = IntPtr.Zero, tmpBuffer = IntPtr.Zero; int entriesRead, totalEntries, resHandle; int sizeofINFO = Marshal.SizeOf(typeof(_SERVER_INFO_100)); try { int ret = NetServerEnum(null, LVL_100, ref buffer, MAX_PREFERRED_LENGTH, out entriesRead, out totalEntries, SV_TYPE_WORKSTATION | SV_TYPE_SERVER, null, out resHandle); if (ret == 0) { for (int i = 0; i < totalEntries; i++) { tmpBuffer = new IntPtr((int)buffer + (i * sizeofINFO)); _SERVER_INFO_100 svrInfo = (_SERVER_INFO_100)Marshal.PtrToStructure(tmpBuffer, typeof(_SERVER_INFO_100)); computers.Add(svrInfo.sv100_name); } } else throw new Win32Exception(ret); } finally { NetApiBufferFree(buffer); } return (string[])computers.ToArray(typeof(string)); } static void Main(string[] args) { string[] computers = GetComputers(); foreach (string computer in computers) { Console.WriteLine(computer); } Console.Read(); } } |
Les classes WebRequest et WebResponse vous permettent respectivement de créer des requêtes HTTP et récupérer les résultats de celles-ci.
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | // Création de la requête System.Net.WebRequest objWebRequest = System.Net.HttpWebRequest.Create("http://dotnet.developpez.com"); // Envoi de la requête au serveur System.Net.WebResponse objWebResponse = objWebRequest.GetResponse(); // Stream pour récupérer le résultat System.IO.StreamReader objStreamReader = null; try { // Récupération du résultat objStreamReader = new System.IO.StreamReader(objWebResponse.GetResponseStream()); // Lecture du résultat textBox_Resultat.Text = objStreamReader.ReadToEnd(); } catch { } finally { // Fermeture de la connexion if (objWebResponse != null) objWebResponse.Close(); } |
Dans certains cas, le client ne veut pas attendre une réponse du serveur après avoir appelé un service Web. L'attribut OneWay indique au serveur que le client ne veut pas recevoir d'acquittements et que sa tâche s'arrête à l'appel de la méthode Web.
Code c# : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | [SoapDocumentMethod(OneWay = true)] //[SoapRpcMethod(OneWay=true)] [WebMethod(Description = "Comment appeler une méthode Web sans attendre une réponse du serveur ?")] public void SaveToLog(string logEntry) { EventLog FaqLog = new EventLog("OneWayAttributeDemo"); FaqLog.Source = "OneWayAttributeDemo"; FaqLog.WriteEntry(logEntry, EventLogEntryType.Information); } |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.