I. Introduction▲
Récemment, j'ai dû étudier la possibilité de transférer un document Word vers un web service. Le web service prend alors en charge le stockage du document. Un document Word 2003 n'étant pas sérialisable, mes investigations m'ont mené vers WSE (Web service extension). Si WSE 1.0 et WSE 2.0 offraient déjà des possibilités en utilisant la technologie DIME et les attachements (class DIMEAttachment), WSE 3.0 offre la possibilité d'utiliser le nouveau standard MTOM. Avec WSE et MTOM, le transfert d'un fichier binaire au travers d'un web service devient un jeu d'enfant. Dans ce tutoriel nous verrons comment réaliser un upload. Vous serez ensuite capable d'adapter cette technologie à vos besoins.
Si vous désirez plus d'informations sur la norme MTOM, je vous suggère de consulter le site du W3C.
II. Configuration▲
Après avoir créé votre projet Web qui va héberger votre web service ainsi que votre projet client, vous allez devoir configurer les projets pour que le web service et le client utilisent les messages SOAP utilisant MTOM.
II-A. Vous utilisez Visual Studio▲
II-A-1. Projet Web service.▲
Le web service doit être configuré pour accepter les messages SOAP utilisant MTOM. La configuration se fait au travers de la fenêtre de paramètres de WSE 3.0 de votre projet. Faites comme suit :
Faites comme suit :
- Cliquez avec le bouton droit sur le nom du projet ;
- Ouvrez la fenêtre "WSE settings 3.0" ;
- Choisissez la tabulation "Messaging" ;
- Choisissez "Optional" ou "Always"pour le mode MTOM ;
- Cliquez sur "OK" pour valider.
Si vous choisissez "Always", tous les web services définis dans ce projet devront obligatoirement recevoir des messages SOAP utilisant MTOM.
II-A-2. Projet client▲
Le client doit être configuré pour envoyer au web service des messages SOAP utilisant MTOM. La configuration se fait au travers de la fenêtre de paramètres de WSE 3.0 de votre projet. Faites comme suit :
- Cliquez avec le bouton droit sur le nom du projet ;
- Ouvrez la fenêtre "WSE settings 3.0" ;
- Choisissez la tabulation "Messaging" ;
- Choisissez "On" comme "Client Mode" ;
- Cliquez sur "OK" pour valider.
II-B. Vous n'utilisez pas Visual Studio▲
Dans ce cas, il vous suffit d'éditer les fichiers de configuration.
N'oubliez pas d'ajouter dans vos projets une référence à Microsoft.Web.Services3
II-B-1. Le Web Service▲
Mettez à jour votre fichier Web.Config, avec le code ci-dessous.
<configSections>
<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration
, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</configSections>
<system.web>
<webServices>
<soapExtensionImporterTypes>
<add type="Microsoft.Web.Services3.Description.WseExtensionImporter, Microsoft.Web.Services3, Version=3.0.0.0
, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
<soapExtensionImporterTypes>
</webServices>
</system.web>
<microsoft.web.services3>
<messaging>
<mtom serverMode="always" />
</messaging>
</microsoft.web.services3>
II-B-2. Le client▲
Dans le fichier de configuration de l'application cliente, Web.Config ou App.Config selon le type, ajoutez le code suivant :
<configuration>
<configSections>
<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration
, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /id="II-B-3">
</configSections>
<microsoft.web.services3>
<messaging>
<mtom ClientMode="On" />
</messaging>
</microsoft.web.services3>
</configuration>
III. Le web service▲
Comme vous allez pouvoir vous en rendre compte, le code côté serveur est on ne peut plus simple. Une fois votre classe WebService créée de façon tout à fait classique, il ne vous reste qu'à ajouter la méthode permettant le téléchargement. Cette classe doit recevoir en paramètre un array de Byte. Dans l'exemple ci-dessous, elle recevra également le nom du fichier. De fait, aucun code particulier n'est nécessaire. La méthode ayant reçu l'array de Byte n'a plus qu'à utiliser un FileStream pour l'écrire sur le serveur.
<WebMethod()>
Public Sub LoadDocument(ByVal fileName as String, ByVal buffer as Byte())
Dim file as FileStream = New FileStream(filename, FileMode.Create)
file.Write(buffer, 0, buffer.LongLength)
file.Close()
End Sub
[WebMethod()]
public void LoadDocument(string fileName, byte[] buffer)
{
FileStream file = New FileStream(filename, FileMode.Create);
file.Write(buffer, 0, buffer.LongLength);
file.Close();
}
IV. Le client▲
Le client n'est pas plus difficile. Après avoir instancié un objet du type du Web service, il n'y a plus qu'à appeler la méthode permettant le téléchargement ("LoadDocument") en utilisant simplement la méthode "ReadAllBytes" de la classe "File" pour lire le fichier et placer son contenu dans un array de bytes.
Dim monWS As New MonWebService
monWS.LoadDocument("MonFichier.doc", File.ReadAllBytes("c:\sources\MonFichierTmp.doc"))
monWS.Dispose()
MonWebService monWS = New MonWebService();
monWS.LoadDocument("MonFichier.doc", File.ReadAllBytes("c:\sources\MonFichierTmp.doc"));
monWS.Dispose();
V. Limitation▲
La taille du fichier transmis est limitée à 4 MB. Si vous désirez transmettre de plus gros fichiers, il sera nécessaire de compléter la configuration.
D'une part, vous devrez autoriser ASP.NET à transmettre de plus longs messages en ajoutant ou modifiant l'attribut "maxMessageLength" de httpRuntime ainsi que vraisemblablement la durée d'exécution. Dans l'exemple qui suit la taille du message est portée à 10MB alors que la durée avant le time out est portée à 3 minutes.
<httpRuntime maxMessageLength="10240"
executionTimeoutInSeconds="180"/>
Il s'agit de la taille du message, la taille réelle du fichier que vous pourrez télécharger est inférieure à cette taille.
<microsoft.web.services3>
<messaging>
<maxMessageLength value="-1" />
</messaging>
</microsoft.web.services3>
Pour ce dernier, n'oubliez pas d'adapter également le client.
Si la taille de vos fichiers est importante, il pourrait être judicieux de prévoir un envoi par bloc.
VI. Conclusion▲
Comme vous avez pu le constater, cette opération est devenue extrêmement simple et ne nécessite aucune expertise particulière. Je vous laisse le soin de réaliser la même opération, mais en sens inverse. Vous aurez alors un Web Service capable de faire de l'Upload et du Download.