Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2824 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Web service et message SOAP XML

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C#] Web service et message SOAP XML

n°2056833
Clarkent
Musclor le shérif de l'espace
Posté le 15-02-2011 à 08:19:04  profilanswer
 

Bonjour,
 
Je suis en .net 3.5, et possibilité d'évoluer vers le 4.
 
J'appelle un webservice, et les équipes de prod aimeraient avoir le contenu de l'appel à ce webservice, c'est à dire le message SOAP qui est généré.
Je n'ai rien trouvé de très claire sur la toile.
Avez vous une solution en modifiant la classe proxy ?
 
De même pour le message de retour, mais je crois qu'il suffit de re-sérialisé l'objet, non ?
 
Merci beaucoup.


Message édité par Clarkent le 15-02-2011 à 08:30:18

---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
mood
Publicité
Posté le 15-02-2011 à 08:19:04  profilanswer
 

n°2056846
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 15-02-2011 à 09:26:18  profilanswer
 

suffit d'utiliser un logiciel de capture de paquets, comme Wireshark ou Fiddler


---------------
J'ai un string dans l'array (Paris Hilton)
n°2056944
Clarkent
Musclor le shérif de l'espace
Posté le 15-02-2011 à 11:39:30  profilanswer
 

Harkonnen a écrit :

suffit d'utiliser un logiciel de capture de paquets, comme Wireshark ou Fiddler


Merci, mais il s'agit d'une application supplémentaire, l'objectif étant d'écrire ça dans les logs de l'application en direction des personnes de la productions, donc aucun ajout de logiciels ou de services supplémentaires n'est possible.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2057086
Clarkent
Musclor le shérif de l'espace
Posté le 15-02-2011 à 19:38:18  profilanswer
 

Pas d'autres suggestions ?


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2057088
moi23372
Posté le 15-02-2011 à 19:38:58  profilanswer
 

il y a moyen de récupérer l'objet WebRequest. Après faudrait voir si on peut convertir cela en xml.  
Complètement inutile de faire cela, mais bon.


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
n°2057093
moi23372
Posté le 15-02-2011 à 19:43:26  profilanswer
 

si je me souviens bien.  
Tu crée une classe de même nom et de même référence que ta "WebReference". Cette classe est de type "partial".  
 
Tu override "GetWebRequest".  
Une fois que tu as l'objet de type "HttpWebRequest", tu peux récupérer le stream.  
 
http://blogs.msdn.com/b/kaevans/ar [...] /9215.aspx
http://bytes.com/topic/c-sharp/ans [...] p-xml-body
 
ça devrait te donner un bon début de piste


---------------
quand un homme raisonne mal c'est qu'il n'a pas les données pour raisonner mieux (diderot)
n°2057177
Clarkent
Musclor le shérif de l'espace
Posté le 15-02-2011 à 23:54:32  profilanswer
 

moi23372 a écrit :

si je me souviens bien.  
Tu crée une classe de même nom et de même référence que ta "WebReference". Cette classe est de type "partial".  
 
Tu override "GetWebRequest".  
Une fois que tu as l'objet de type "HttpWebRequest", tu peux récupérer le stream.  
 
http://blogs.msdn.com/b/kaevans/ar [...] /9215.aspx
http://bytes.com/topic/c-sharp/ans [...] p-xml-body
 
ça devrait te donner un bon début de piste


 
Merci pour la piste, j'essaierai ça demain :).


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2057525
TotalRecal​l
Posté le 17-02-2011 à 14:09:15  profilanswer
 

Tu dis que tu es en 3.5, (donc WCF) hors la solution qui t'est ici proposée ici s'applique à une reference 2.0 si je ne m'abuse. C'est complètement différent.
 
Pour du WCF il faut qu'après avoir instancié ton "client" tu viennes affecter à client.Endpoint.Behaviors une instance d'une classe qui réalise les bonnes méthodes des interfaces "IEndpointBehavior" et "IClientMessageInspector".
C'est facile, avec google tu devrais trouver rapidement.
 
rq : cela peut aussi se faire de façon déclarative dans le fichier de conf de ton appli, mais je préfère la solution qui passe par le code.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2061422
Clarkent
Musclor le shérif de l'espace
Posté le 06-03-2011 à 14:54:07  profilanswer
 

Hello,
 
J'ai pas encore véritablement eu le temps d'essayer, mais je pense en effet que c'est la bonne voie.
 
Merci TotalRecall.
 
Par contre je n'ai pas trouvé un truc sur le net de "tuto" indiquant cette procédure, mais dés que j'ai le temps de le tester je m'y mets.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2061452
TotalRecal​l
Posté le 06-03-2011 à 16:10:40  profilanswer
 

Si j'y pense demain je te récupérerai un exemple, avec une implé qui marche côté client et une côté serveur (le cas le plus chiant) :jap:


Message édité par TotalRecall le 06-03-2011 à 16:11:06

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
mood
Publicité
Posté le 06-03-2011 à 16:10:40  profilanswer
 

n°2061704
TotalRecal​l
Posté le 07-03-2011 à 17:44:24  profilanswer
 

Pour le côté client :

Code :
  1. public class WcfClientSideInspectorBehavior : IEndpointBehavior, IClientMessageInspector
  2.     {
  3.         #region Log Getter
  4.         /// <summary>
  5.         /// Outils permettant la gestion d'un fichier de log
  6.         /// </summary>
  7.         protected static ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  8.         #endregion
  9.         #region Properties
  10.         /// <summary>
  11.         /// Message envoyé par le service
  12.         /// </summary>
  13.         public string RequestMessage { get; set; }
  14.         /// <summary>
  15.         /// Réponse reçue par le service
  16.         /// </summary>
  17.         public string ResponseMessage { get; set; }
  18.         #endregion
  19.         #region IEndpointBehavior Members
  20.         public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
  21.         {
  22.         }
  23.         public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
  24.         {
  25.             // adds our inspector to the runtime
  26.             clientRuntime.MessageInspectors.Add(this);
  27.         }
  28.         public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
  29.         {
  30.         }
  31.         public void Validate(ServiceEndpoint endpoint)
  32.         {
  33.         }
  34.         #endregion
  35.         #region IClientMessageInspector Members
  36.         /// <summary>
  37.         /// Méthode appelée après réception d'une réponse
  38.         /// </summary>
  39.         /// <param name="reply"></param>
  40.         /// <param name="correlationState"></param>
  41.         void IClientMessageInspector.AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
  42.         {
  43.             this.ResponseMessage = reply.ToString();
  44.             _log.Debug(ResponseMessage);
  45.         }
  46.         /// <summary>
  47.         /// Méthode appelant envoi l'envoi de la requête, alors que celle-ci a été construite
  48.         /// </summary>
  49.         /// <param name="request"></param>
  50.         /// <param name="channel"></param>
  51.         /// <returns></returns>
  52.         object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel)
  53.         {
  54.             this.RequestMessage = request.ToString();
  55.             _log.Debug(RequestMessage);
  56.             return null;
  57.         }
  58.         #endregion
  59.     }


A lier à .Endpoint.Behaviors.Add(inspector); lors de l'instanciation de ton client.

  

Et pour le côté serveur si besoin :

Code :
  1. public class WcfServerSideInspectorBehavior : IDispatchMessageInspector
  2.     {
  3.         #region Log Getter
  4.         /// <summary>
  5.         /// Outils permettant la gestion d'un fichier de log
  6.         /// </summary>
  7.         protected static ILog _log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
  8.         #endregion
  9.         public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext)
  10.         {
  11.             //MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
  12.             //request = buffer.CreateMessage();
  13.             //string received = buffer.CreateMessage().ToString();
  14.             string received = request.ToString();
  15.             _log.Debug("Received : " + received);
  16.             return null;
  17.         }
  18.         public void BeforeSendReply(ref Message reply, object correlationState)
  19.         {
  20.             MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue);
  21.             reply = buffer.CreateMessage();
  22.             string sending = buffer.CreateMessage().ToString();
  23.            
  24.             _log.Debug("Sending : " + sending);
  25.         }
  26.     }


Accompagné de l'attribut :

Code :
  1. [AttributeUsage(AttributeTargets.Class)]
  2.     public class WcfServerSideInspectorBehaviorAttribute : Attribute, IServiceBehavior
  3.     {
  4.         public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
  5.         {
  6.         }
  7.         public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  8.         {
  9.             for (int i = 0; i < serviceHostBase.ChannelDispatchers.Count; i++)
  10.             {
  11.                 ChannelDispatcher channelDispatcher = serviceHostBase.ChannelDispatchers[i] as ChannelDispatcher;
  12.                 if (channelDispatcher != null)
  13.                 {
  14.                     foreach (EndpointDispatcher endpointDispatcher in channelDispatcher.Endpoints)
  15.                     {
  16.                         WcfServerSideInspectorBehavior inspector = new WcfServerSideInspectorBehavior();
  17.                         endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
  18.                     }
  19.                 }
  20.             }
  21.         }
  22.         public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
  23.         {
  24.         }
  25.     }


Que tu poses sur la classe implémentant ton service (     [WcfServerSideInspectorBehavior()] )

 

Pour moi les deux fonctionnent nickel avec les bindings SOAP standards. De mémoire rien à modifier dans le fichier de conf de l'appli : tout se fait sur le code.

 

Evidemment tu peux supprimer les références à log4net pour y mettre une écriture de fichier ou ce que tu voudras comme framework de logging.


Message édité par TotalRecall le 07-03-2011 à 17:46:57

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2063098
Clarkent
Musclor le shérif de l'espace
Posté le 14-03-2011 à 07:50:23  profilanswer
 

Wow, merci TotalRecall, j'espère avoir le temps cette semaine pour tester cela.
 
En tous cas merci beaucoup pour ton aide ;), j'espère revenir en disant que tout est ok cette semaine :p.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2067601
Clarkent
Musclor le shérif de l'espace
Posté le 01-04-2011 à 17:27:56  profilanswer
 

TotalRecall > J'ai testé pour le client.
Ca fonctionne très bien ;).
 
Je n'ai pas encore essayé pour le serveur.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2067862
Clarkent
Musclor le shérif de l'espace
Posté le 04-04-2011 à 14:02:10  profilanswer
 

Hello,
 
Pour tracer les requêtes du coté du WebService, je n'arrive pas vraiment à saisir l'exemple que tu m'as donné, et à part dans le fichier de configuration je ne vois pas comment l'implémenter directement dans le code (pour l'associé au behavior).
A quoi sert la classe attribute ?
un peu perdu en somme.
 
Merci.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".
n°2068105
Clarkent
Musclor le shérif de l'espace
Posté le 05-04-2011 à 12:10:12  profilanswer
 

Hello,
 
J'ai trouvé quelques explications très détaillées, pour ceux que cela intéresse :
http://msdn.microsoft.com/en-us/magazine/cc163302.aspx
http://www.thereforesystems.com/ca [...] f-service/
 
Mon manque de connaissance dans le fonctionnement de WCF a fait que j'ai été un peu perdu côté serveur ;).
 
Merci.


---------------
"PAR LE POUVOIR DU CRÂNE ANCESTRAL, JE DETIENS LA FORCE TOUTE PUISSANTE".

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  [C#] Web service et message SOAP XML

 

Sujets relatifs
[PYTHON] Module C++ pour pythonScript import Flux RSS / XML
Recherche le titre d'un bouquin C++Parser un flux XML en PHP pour récupérer une valeur
Validation XML en Java - Problème de namespaceProblème de validation XML via SAX
Programmation en C, besoin d'aideProblème C++ : Syntax error : missing ';'
Plus de sujets relatifs à : [C#] Web service et message SOAP XML


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR