Transfert de fichiers en utilisant un Web Service avec la technologie MTOM et WSE 3.0

Jean-Alain Baeyens

Si vous utilisez une architecture utilisant la technologie web service, vous aurez peut-être besoin de transférer des fichiers au travers de ces web services (upload, download, transfert d'une image vers l'interface graphique…). Un moyen très simple pour y parvenir est l'utilisation de MTOM (Message Transmission Optimization Mechanism).

N'hésitez pas à commenter cet article ! Commentez ♪

- Titre : Transfert de fichiers en utilisant un Web Service avec la technologie MTOM et WSE 3.0

- Auteur : Jean-Alain Baeyens

- Parution : 17 janvier 2008

- Licence : Les 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 ® 2013 Jean-Alain Baeyens. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Configuration

- II-A. Vous utilisez Visual Studio

- II-A-1. Projet Web service.

- II-A-2. Projet client

- II-B. Vous n'utilisez pas Visual Studio

- II-B-1. Le Web Service

- II-B-2. Le client

- III. Le web service

- IV. Le client

- V. Limitation

- VI. Conclusion

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 :

1. Cliquez avec le bouton droit sur le nom du projet ;

2. Ouvrez la fenêtre "WSE settings 3.0" ;

3. Choisissez la tabulation "Messaging" ;

4. Choisissez "Optional" ou "Always"pour le mode MTOM ;

5. 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 :

1. Cliquez avec le bouton droit sur le nom du projet ;

2. Ouvrez la fenêtre "WSE settings 3.0" ;

3. Choisissez la tabulation "Messaging" ;

4. Choisissez "On" comme "Client Mode" ;

5. 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.

Web.Config

<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.

VB.NET

<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

C#

[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.

VB.NET

Dim monWS As New MonWebService
monWS.LoadDocument("MonFichier.doc", File.ReadAllBytes("c:\sources\MonFichierTmp.doc"))
monWS.Dispose()

C#

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.