Programmation réseau dans le .NET Compact Framework
Mise à jour : novembre 2007
Le .NET Compact Framework offre une prise en charge intégrée des services Web XML, ainsi que la prise en charge et les fonctionnalités de protocole suivantes :
Protocoles HTTP.
Authentification NTLM.
Contenu XML codé selon le protocole SOAP. Cette prise en charge inclut le passage de groupes de données ADO.NET.
Méthodes Web Request et Web Response pouvant envoyer des messages SOAP HTTP et recevoir des messages SOAP en réponse.
Bibliothèques et méthodes SOAP pouvant sérialiser et désérialiser des appels de méthode et des objets arbitraires dans des messages SOAP XML.
Demandes HTTP
Les éléments suivants ont rapport à l'envoi et à la réception des demandes HTTP :
En utilisant l'émulateur, n'employez pas localhost comme nom du serveur. Spécifiez le nom d'ordinateur ou l'adresse IP de l'ordinateur de développement hébergeant le service Web.
L'émulateur, comme un périphérique, possède sa propre adresse IP. L'emploi de localhost prescrit à l'émulateur de s'utiliser lui-même pour établir la connexion au service Web, au lieu d'utiliser le service Web hébergé par votre environnement de développement ou un autre ordinateur de bureau.
Par exemple, au lieu de :
https://localhost/myWebService/Service1.asmx
Spécifiez :
http://ComputerName/myWebService/Service1.asmx
Lorsqu'il émet une demande HTTP à l'aide de HttpWebRequest, le périphérique établit une nouvelle connexion réseau si aucune connexion réseau n'est disponible. Par conséquent, le fait d'émettre une demande HTTP seulement pour déterminer si une connexion est disponible peut conduire le périphérique à essayer d'initier une connexion, par exemple une connexion GPRS.
Le .NET Compact Framework ne stocke pas d'informations de proxy dans la propriété GlobalProxySelection.Select, mais il utilise cette propriété pour les connexions HTTP si vous spécifiez une valeur dans votre code.
Pour vous connecter à Internet, il peut s'avérer nécessaire de spécifier vos paramètres de proxy locaux. Le code suivant montre comment définir le proxy pour le port 80 :
System.Net.GlobalProxySelection.Select = new WebProxy("http://myproxy:80");
Si vous affectez false à AllowWriteStreamBuffering, les données ne seront pas mises en mémoire tampon et ne prendront pas en charge les demandes d'authentification ou les redirections par le serveur Web.
Pour assurer le succès de ces opérations, spécifiez des chemins d'accès absolus.
Notez le comportement Windows CE suivant lors de la résolution des spécifications de fichier relatif :
file://myfile est résolu en tant que \\myfile.
file:///myfile est résolu en tant que \myfile dans le répertoire racine.
Un problème connu, posé par le .NET Framework, est que la méthode Dns.GetHostName lève une exception lorsque plus de 50 protocoles réseau sont installés sur l'ordinateur actif.
Pour contourner ce problème, désinstallez les protocoles réseau qui ne sont pas réellement nécessaires. Pour ce faire, vous pouvez utiliser le Gestionnaire de périphériques de Windows afin de supprimer les cartes réseau inutilisées. Une autre possibilité consiste à désinstaller les applications ayant installé des protocoles.
Communications mobiles sécurisées
Il existe deux moyens principaux pour établir des communications mobiles sécurisées :
l'authentification par HTTP
Le .NET Compact Framework prend en charge les modes d'authentification Basic et Digest. Ces mécanismes d'authentification sont simples et leur niveau de sécurité et de compromis est assez bien connu, l'un de ces compromis étant que le service Web se limite à une liaison HTTP.
La version 2.0 du .NET Compact Framework prend en charge des serveurs qui exécutent NTLM ou Kerberos (« Authentification intégrée à Windows »), qui ne nécessite aucune modification du code d'authentification Basic ou Digest existant.
En-têtes de sécurité personnalisés
Le .NET Compact Framework ne prend pas en charge à l'heure actuelle les services de sécurité Web (WS-Security) et les améliorations de service Web (WSE).
En outre, que vous fassiez appel aux méthodes d'authentification par HTTP ou par en-tête personnalisé, vous pouvez utiliser le protocole SSL pour augmenter le niveau de sécurité. L'authentification de base passe le nom et le mot de passe en texte clair, c'est pourquoi elle n'est pas particulièrement sécurisée à moins qu'elle soit exécutée à partir de SSL. Toutefois, lorsqu'elle est utilisée conjointement à SSL, elle est relativement sécurisée, le seul problème significatif étant la divulgation accidentelle des informations d'identification au serveur cible.
Remarque Le .NET Compact Framework ne prend pas en charge l'authentification côté client à l'aide des certificats X509.
Considérations sur la longueur du contenu
En envoyant à l'aide du protocole POST une demande Web HTTP portant sur un contenu à diffuser en continu, vous devez spécifier une longueur de contenu. En supposant que SendChunked est false et que Method = POST, spécifiez une valeur pour ContentLength.
À la différence du .NET Framework, le .NET Compact Framework ne stocke pas automatiquement les données en mémoire tampon afin de tenir compte des contraintes de mémoire des périphériques. Pour garantir la mise en mémoire tampon, affectez false à SendChunked.
Un flux de demande dont la longueur de contenu est égale à zéro provoque une ObjectDisposedException s'il n'a pas été obtenu et fermé correctement. Pour gérer des demandes dont la longueur de contenu est égale à zéro, vous devez appeler explicitement la méthode GetRequestStream, puis appeler la méthode Close sur le flux de données retourné sans appeler la méthode Write, comme illustré dans l'exemple de code suivant.
private static void ZeroLengthRequest()
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(
requestUri + "?dummy=true");
request.AllowWriteStreamBuffering = true;
request.Credentials = CredentialCache.DefaultNetworkCredentials;
request.Credentials = netCred;
request.ConnectionGroupName = "mygroup";
request.ContentLength = 0;
request.KeepAlive = true;
request.Method = "POST";
request.ServicePoint.UseNagleAlgorithm = false;
request.Timeout = System.Threading.Timeout.Infinite;
request.UnsafeAuthenticatedConnectionSharing = true;
Stream req = request.GetRequestStream();
req.Close();
using (request.GetResponse())
{
...
}
}
Private Shared Sub ZeroLengthRequest()
Dim request As HttpWebRequest = _
CType(WebRequest.Create(requestUri + "?dummy=true"), _
HttpWebRequest)
request.AllowWriteStreamBuffering = true
request.Credentials = CredentialCache.DefaultNetworkCredentials
request.Credentials = netCred
request.ConnectionGroupName = "mygroup"
request.ContentLength = 0
request.KeepAlive = true
request.Method = "POST"
request.ServicePoint.UseNagleAlgorithm = false
request.Timeout = System.Threading.Timeout.Infinite
request.UnsafeAuthenticatedConnectionSharing = true
Dim req As Stream = request.GetRequestStream
req.Close
request.GetResponse
End Sub
Voir aussi
Autres ressources
Mise en réseau et connectivité dans le .NET Compact Framework