[C#] Web service et message SOAP XML

Web service et message SOAP XML [C#] - C#/.NET managed - Programmation

Marsh Posté le 15-02-2011 à 08:19:04    

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

Marsh Posté le 15-02-2011 à 08:19:04   

Reply

Marsh Posté le 15-02-2011 à 09:26:18    

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


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 15-02-2011 à 11:39:30    

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

Marsh Posté le 15-02-2011 à 19:38:18    

Pas d'autres suggestions ?


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

Marsh Posté le 15-02-2011 à 19:38:58    

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)
Reply

Marsh Posté le 15-02-2011 à 19:43:26    

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)
Reply

Marsh Posté le 15-02-2011 à 23:54:32    

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

Marsh Posté le 17-02-2011 à 14:09:15    

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
Reply

Marsh Posté le 06-03-2011 à 14:54:07    

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

Marsh Posté le 06-03-2011 à 16:10:40    

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
Reply

Marsh Posté le 06-03-2011 à 16:10:40   

Reply

Marsh Posté le 07-03-2011 à 17:44:24    

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
Reply

Marsh Posté le 14-03-2011 à 07:50:23    

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

Marsh Posté le 01-04-2011 à 17:27:56    

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

Marsh Posté le 04-04-2011 à 14:02:10    

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

Marsh Posté le 05-04-2011 à 12:10:12    

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

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed