La journalisation du SAVON de demande et de réponse sur le côté serveur

Je suis en train de créer un service de journalisation pour SOAP tous les appels de méthode à mon ASP.NET webservice. J'ai été à la recherche à
Journal des messages SOAP à partir d'une application console et la procédure pas à pas pour les extensions SOAP à MSDN ( http://msdn.microsoft.com/en-us/library/s25h0swd%28v=vs.100%29.aspx ), mais ils ne semblent pas à la recouvrir complètement.

Je ne veux pas modifier le message SOAP, il suffit de se connecter à une table de base de données.
Ce que j'essaie de faire est de lire le message SOAP des flux, de l'analyser comme un XML, journal le XML et le laisser à l'appel dans son petit bonhomme de chemin. Mais quand j'ai lu le flux est passé/cédées. J'ai essayé de copier le flux de contenu pour ne pas interrompre le flux.

Selon la procédure pas à pas la ProcessMessage méthode devrait ressembler à quelque chose comme ceci:

public override void ProcessMessage(SoapMessage message) 
{
   switch (message.Stage) 
   {
   case SoapMessageStage.BeforeSerialize:
       break;
   case SoapMessageStage.AfterSerialize:
       //Write the SOAP message out to a file.
       WriteOutput( message );
       break;
   case SoapMessageStage.BeforeDeserialize:
       //Write the SOAP message out to a file.
       WriteInput( message );
       break;
   case SoapMessageStage.AfterDeserialize:
       break;
   default:
       throw new Exception("invalid stage");
   }
}

J'ai réussi à analyser le flux sans problèmes pendant la BeforeDeserialize scène, mais alors ProcessMessage est convoquée à nouveau dans le AfterSerialize scène, et puis le flux est utilisé et ne contient plus de données.

Selon le Message SOAP Modification à l'Aide des Extensions SOAP (http://msdn.microsoft.com/en-us/library/esw638yk%28v=vs.100%29.aspx) le SAVON d'appel passe par les étapes suivantes:

Côté serveur Reçoit un Message de Demande et Prépare une Réponse

  1. ASP.NET sur le serveur Web reçoit le message SOAP.
  2. Une nouvelle instance de l'extension SOAP est créé sur le serveur Web.
  3. Sur le serveur Web, si c'est la première fois que cette extension SOAP a exécuté avec ce service Web sur le serveur, les GetInitializer méthode est appelée sur le SAVON d'extension en cours d'exécution sur le serveur.
  4. La méthode Initialize est invoquée.
  5. La ChainStream méthode est invoquée.
  6. La ProcessMessage méthode est appelée avec SoapMessageStage ensemble de BeforeDeserialize.
  7. ASP.NET désérialise les arguments dans le XML.
  8. La ProcessMessage méthode est appelée avec SoapMessageStage ensemble de AfterDeserialize.
  9. ASP.NET crée une nouvelle instance de la classe implémentant le service Web et invoque la méthode de service Web, en passant dans le désérialisé arguments. Cet objet se trouve sur le même ordinateur que le serveur Web.
  10. La méthode de service Web exécute son code, éventuellement le réglage de la valeur de retour et les paramètres.
  11. La ProcessMessage méthode est appelée avec SoapMessageStage ensemble de BeforeSerialize.
  12. ASP.NET sur le serveur Web sérialise la valeur de retour et les paramètres de sortie en XML.
  13. La ProcessMessage méthode est appelée avec SoapMessageStage ensemble de AfterSerialize.
  14. ASP.NET envoie le message de réponse SOAP sur le réseau pour le client de service Web.

L'étape 6 est correctement effectuée et le SAVON XML est connecté. Alors il ne faut plus rien faire jusqu'à ce que une fois que le serveur a traité l'appel, fait ce dont il a besoin (étape 10), et a renvoyé une réponse (étape 13). Au lieu de cela, il appelle immédiatement ProcessMessage de nouveau dans le AfterSerialize scène, mais cette fois, le flux est déjà passé et déclenche une exception lorsque j'essaie de me connecter.

Selon la procédure pas à pas que je devrais utiliser le ChainStream méthode, et il doit être exécuté à l'étape 5 ci-dessus. Quand je fais l'appel, il est exécuté deux fois, une fois avant BeforeDeserialize et une fois avant de AfterSerialize.

J'ai essayé de copier le flux de messages à un flux distinct et l'utiliser pour l'enregistrement, également à mettre en place une sorte de statut, si BeforeDeserialize ont déjà exécuté, mais le problème persiste encore.

J'ai encore besoin de le code dans AfterSerialize pour gérer la réponse est envoyée au client. Mais si j'essaie d'enlever mon code dans AfterSerialize et seulement exécuter le code dans BeforeDeserialize' I get aHTTP 400: Bad Request`.

Tout cela se fait avant l'appel de la méthode, de sorte que je n'ai même jamais obtenir le code à l'intérieur de la méthode (étape 10).

Le code de bonne, en VB, mais facilement transformable en C# : github.com/Apress/pro-asp.net-1.1-in-vb-.net/blob/master/source/...

OriginalL'auteur kumaheiyama | 2014-01-19