2010-11-04 21 views
2

Dans mon application, j'appelle un service Web et en utilisant SoapExtension et SoapExtensionAttribute, je peux intercepter les messages SOAP entrants et sortants à des fins de consignation. J'ai utilisé l'exemple dans http://msdn.microsoft.com/en-us/magazine/cc164007.aspx en entrée. Mais maintenant je veux aller un peu plus loin. J'ai un client Windows qui appelle ma classe (dans un projet séparé) et la classe appelle ensuite le service Web. Je peux maintenant intercepter les messages SOAP, mais au lieu de les journaliser directement dans un fichier, je veux renvoyer ces messages à ma classe qui appelle le service Web et aussi au client qui appelle ma classe. Ce sont les changements de code que je l'ai fait jusqu'à présent:Transmettre des informations à l'objet sur lequel un SoapExtensionAttribute est appliqué

 private String ExtractFromStream(Stream target) 
    { 
     if (target != null) 
      return (new StreamReader(target)).ReadToEnd(); 

     return ""; 
    } 

    public void WriteOutput(SoapMessage message) 
    { 
     newStream.Position = 0; 
     string soapOutput = ExtractFromStream(newStream); 

     newStream.Position = 0; 
     Copy(newStream, oldStream); 
    } 

    public void WriteInput(SoapMessage message) 
    { 
     Copy(oldStream, newStream); 

     newStream.Position = 0; 
     string soapInput= ExtractFromStream(newStream); 
     newStream.Position = 0; 
    } 

Je veux maintenant passer le soapInput et soapOutput à la classe qui détient la méthode que cet attribut est appliqué. Des indices sur comment je devrais faire ça?

Répondre

2

Pour toute personne qui arrive à passer, voici la solution:

L'objet SoapMessage ne contient pas d'informations sur mon client. Cependant, je peux convertir cet objet en un objet SoapClientMessage et ensuite j'aurai accès à mon service Web. Si j'ajoute maintenant une méthode à cette webservice (en créant une nouvelle classe partielle public) Je peux accéder à ses propriétés et ses méthodes comme celle-ci (purement un exemple!):

private String ExtractFromStream(Stream target) 
    { 
     if (target != null) 
      return (new StreamReader(target)).ReadToEnd(); 

     return ""; 
    } 



    public void WriteOutput(SoapMessage message) 
    { 
     newStream.Position = 0; 

     string soapOutput = ExtractFromStream(newStream); 
     SoapClientMessage soapClient = (SoapClientMessage)message; 
     WebServiceClass webservice = (WebServiceClass)soapClient.Client; 
     webservice.MyMethod(soapOutput); //Use your own method here! 


     newStream.Position = 0; 
     Copy(newStream, oldStream); 
    } 

    public void WriteInput(SoapMessage message) 
    { 
     Copy(oldStream, newStream);   
     newStream.Position = 0; 

     string soapInput= ExtractFromStream(newStream); 
     SoapClientMessage soapClient = (SoapClientMessage)message; 
     WebServiceClass webservice = (WebServiceClass)soapClient.Client; 
     webservice.MyMethod(soapInput); 
     newStream.Position = 0; 
    } 

Vous pouvez ajouter des méthodes (comme le MyMethod en cet exemple) à votre WebServiceClass en créant une nouvelle classe partielle publique et en ajoutant des méthodes, des propriétés et tout ce que vous aimez.