IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

[C# 2.0]Compression des flux SOAP


Sujet :

Services Web

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut [C# 2.0]Compression des flux SOAP
    Salut à tous,

    Voici mon PB. J'appel un WebService Java depuis mon code C#. Seulement, les données que je passe en entrée des méthodes de ce WebService sont assez importantes. Je souhaiterais donc compresser la demande et réduire ainsi la quantité de donnée qui transite sur le réseau.
    J'ai donc mis en place une SoapExtension et j'utilise le namespace System.IO.Compression pour la compression gzip.
    Mais mon PB est que ça ne marche pas, ma request ne semble pas compressée.

    Voici mon code :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	public class CompressionExtension : System.Web.Services.Protocols.SoapExtension
    	{
    		Stream oldStream;
    		Stream newStream;
     
    		public override Stream ChainStream(Stream stream)
    		{
    			//return base.ChainStream(stream);
    			oldStream = stream;
    			newStream = new MemoryStream();
    			return newStream;
    		}
     
    		public override object GetInitializer(Type serviceType)
    		{
    			return typeof(CompressionExtension);
    		}
     
    		public override object GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo methodInfo, System.Web.Services.Protocols.SoapExtensionAttribute attribute)
    		{
    			return attribute;
    		}
     
    		public override void Initialize(object initializer)
    		{
    			return;
    		}
     
    		public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
    		{
    			switch (message.Stage)
    			{
    				case System.Web.Services.Protocols.SoapMessageStage.AfterDeserialize:
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.AfterSerialize:
    					Zip();
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.BeforeDeserialize:
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.BeforeSerialize:
    					message.ContentEncoding = "gzip";
    					break;
    				default:
    					throw new Exception("invalid stage");
    					break;
    			}
    		}
     
    		private void Zip()
    		{
    			newStream.Position = 0;
    			newStream = new GZipStream(newStream, CompressionMode.Compress).BaseStream;
    			newStream.Position = 0;
    			Copy(newStream, oldStream);
    		}
     
    		void Copy(Stream from, Stream to)
    		{
    			TextReader reader = new StreamReader(from);
    			TextWriter writer = new StreamWriter(to);
    			writer.WriteLine(reader.ReadToEnd());
    			writer.Flush();
    		}
    	}

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par guitoux1 Voir le message
    Mais mon PB est que ça ne marche pas
    C'est à dire ?
    Citation Envoyé par guitoux1 Voir le message
    ma request ne semble pas compressée.
    Elle l'est ou bien elle ne l'est pas, sur quoi te bases tu pour tester ? analyse des trames ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Bon c'est bon j'arrive à compresser ma request maintenant. Mais mon PB est que côté Java, il dit que le format n'est pas du GZIP. C'est plutôt bizarre vu que j'utilise un GZipStream ?? je vais essayer avec une autre librairie de compression.
    Voilà le code MAJ.

    PS : Je me sers de Fiddler pour voir le contenu de la request que j'envoi

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	public class CompressionExtension : System.Web.Services.Protocols.SoapExtension
    	{
    		Stream oldStream;
    		Stream newStream;
     
    		public override Stream ChainStream(Stream stream)
    		{
    			//return base.ChainStream(stream);
    			oldStream = stream;
    			newStream = new MemoryStream();
    			return newStream;
    		}
     
    		public override object GetInitializer(Type serviceType)
    		{
    			return typeof(CompressionExtension);
    		}
     
    		public override object GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo methodInfo, System.Web.Services.Protocols.SoapExtensionAttribute attribute)
    		{
    			return attribute;
    		}
     
    		public override void Initialize(object initializer)
    		{
    			return;
    		}
     
    		public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
    		{
    			switch (message.Stage)
    			{
    				case System.Web.Services.Protocols.SoapMessageStage.AfterDeserialize:
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.AfterSerialize:
    					Zip();
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.BeforeDeserialize:
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.BeforeSerialize:
    					message.ContentEncoding = "gzip";
    					break;
    				default:
    					throw new Exception("invalid stage");
    					break;
    			}
    		}
     
    		private void Zip()
    		{
    			newStream.Position = 0;
    			MemoryStream ms = new MemoryStream();
    			GZipStream gStream = new GZipStream(ms, CompressionMode.Compress);
    			byte[] data = new byte[4096];
    			int n = 0;
    			while ((n = newStream.Read(data, 0, data.Length)) != 0)
    			{
    				gStream.Write(data, 0, n);
    			}
     
    			newStream = gStream.BaseStream;
    			newStream.Position = 0;
    			Copy(newStream, oldStream);
    		}
     
    		void Copy(Stream from, Stream to)
    		{
    			TextReader reader = new StreamReader(from);
    			TextWriter writer = new StreamWriter(to);
    			writer.WriteLine(reader.ReadToEnd());
    			writer.Flush();
    		}
    	}

  4. #4
    Membre Expert
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Par défaut
    Il faut fermer ton gzipstream pour que ça fonctionne convenablement

    Comment compresser et décompresser un string

  5. #5
    Membre Expert Avatar de guitoux1
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 011
    Par défaut
    Merci.
    En fait j'ai trouvé le problème. Il venait de la fonction Copy() qui en utilisant un TextWriter modifier le flux gzip.
    J'arrive maintenant correctement à compresser ma request. Mais maintenant j'ai un autre soucis : la décompression automatique de la response ne se fait plus.
    Avant, j'utiliser EnableDecompression = true sur mon service, et du coup il ajout Accept-encoding = "gzip" dans le HttpHeader. Le service Java dernière renvoi dans ce cas la response en gzip, et automatiquement DotNet décompresse la response.
    Mais depuis la mise en place de cette SoapExtension, la décompression ne fonctionne plus. Pourtant la response est OK (vu avec Fiddler + test sans la SoapExtension). Je comprends pas pourquoi. J'ai alors essayer d'implémenter moi-même la décompression, mais sans succès, j'ai toujours la même erreur, à savoir que le retour n'est pas du XML correct. Voici le code complet de ma SoapExtension :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    	public class CompressionExtension : System.Web.Services.Protocols.SoapExtension
    	{
    		Stream oldStream;
    		Stream newStream;
     
    		public override Stream ChainStream(Stream stream)
    		{
    			oldStream = stream;
    			newStream = new MemoryStream();
    			return newStream;
    		}
     
    		public override object GetInitializer(Type serviceType)
    		{
    			return typeof(CompressionExtension);
    		}
     
    		public override object GetInitializer(System.Web.Services.Protocols.LogicalMethodInfo methodInfo, System.Web.Services.Protocols.SoapExtensionAttribute attribute)
    		{
    			return attribute;
    		}
     
    		public override void Initialize(object initializer)
    		{
    			return;
    		}
     
    		public override void ProcessMessage(System.Web.Services.Protocols.SoapMessage message)
    		{
    			switch (message.Stage)
    			{
    				case System.Web.Services.Protocols.SoapMessageStage.AfterDeserialize:
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.AfterSerialize:
    					Zip(message.Stream);
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.BeforeDeserialize:
    					Unzip(message.Stream);
    					break;
    				case System.Web.Services.Protocols.SoapMessageStage.BeforeSerialize:
    					message.ContentEncoding = "gzip";
    					break;
    				default:
    					throw new Exception("invalid stage");
    					break;
    			}
    		}
     
    		private void Unzip(Stream message)
    		{
    			MemoryStream ms = new MemoryStream();
    			ms.Position = 0;
    			message.Position = 0;
    			GZipInputStream zip = new GZipInputStream(message);
    			byte[] data = new byte[1024];
    			int offset = 0;
     
    			while ((offset = zip.Read(data, 0, data.Length)) > 0)
    			{
    				ms.Write(data, 0, offset);
    			}
    			ms.Flush();
    			ms.Position = 0;
    			Copy(ms, newStream);
    			zip.Close();
    		}
     
    		private void Zip(Stream message)
    		{
    			message.Position = 0;
    			MemoryStream ms = new MemoryStream();
    			ms.Position = 0;
    			message.Position = 0;
    			GZipOutputStream zip = new GZipOutputStream(ms);
    			byte[] data = new byte[1024];
    			int offset = 0;
     
    			while ((offset = message.Read(data, 0, data.Length)) > 0)
    			{
    				zip.Write(data, 0, offset);
    			}
    			zip.Finish();
    			ms.Position = 0;
    			Copy(ms, oldStream);
    			zip.Close();
    		}
     
    		void Copy(Stream from, Stream to)
    		{
    			byte[] data = new byte[1024];
    			int offset = 0;
    			while ((offset = from.Read(data, 0, data.Length)) != 0)
    			{
    				to.Write(data, 0, offset);
    			}
    			to.Flush();
    		}
    	}

Discussions similaires

  1. Compresser un flux SOAP (XML) Web Service
    Par mls dans le forum Web & réseau
    Réponses: 1
    Dernier message: 03/05/2011, 17h57
  2. [Web Service][SOAP] Compression des données avec NuSOAP ?
    Par lasdou15 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 17/04/2008, 12h14
  3. [GZIP] Compression des trames TCP ?
    Par SteelBox dans le forum Développement
    Réponses: 6
    Dernier message: 11/01/2005, 05h34
  4. [DOM] Comment créer des flux XML en java ?
    Par nean_j dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 27/04/2004, 12h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo