2009-03-12 4 views
6

J'ai créé une classe SoapExtension pour capturer la demande de savon et la réponse d'appels de service Web spécifiques. Afin de mettre en place cette extension SoapExtension, je dois ajouter un attribut à la méthode dans le client proxy généré.Comment ajouter l'attribut SoapExtension au proxy client du service Web généré sans modifier la classe générée?

Par exemple, j'ai ajouté l'attribut AuditSoapCapture à cette méthode:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://blahblah.com/webservices/AddressSearch", RequestNamespace = "http://blahblah.com/webservices/", ResponseNamespace = "http://blahblah.com/webservices/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] 
    [blahblah.TriadLite.Core.AuditSoapCapture] 
    public System.Data.DataSet AddressSearch(string HouseNumber, string StreetName, string ZipCode) { 
     object[] results = this.Invoke("AddressSearch", new object[] { 
        HouseNumber, 
        StreetName, 
        ZipCode}); 
     return ((System.Data.DataSet)(results[0])); 
    } 

Je cherche un moyen d'ajouter cet attribut à des méthodes spécifiques sans modifier le proxy client généré, car ils seront perdus quand nous nous régénérons. Puis-je le faire dans une autre classe ou interface partielle ou d'une autre manière?

Merci!

+0

Essayez d'utiliser [SchemaImporterExtension] (http://msdn.microsoft.com/en-us/library/system.xml.serialization.advanced.schemaimporterextension.aspx) infrastructure en appelant wsdl.exe avec l'option '/ parameters' (http://msdn.microsoft.com/en-us/library/7h3ystb6.aspx) – Lu55

Répondre

1

Malheureusement, vous devrez modifier le code du proxy. Les autres possibilités que vous mentionnez ne fonctionneront pas - une classe pariale ne remplacera pas les fonctionnalités existantes, et je ne suis pas du tout au courant d'avoir une interface pour faire ce dont vous avez besoin (aggravée par le fait qu'il n'y a pas moyen de laisser le générateur de proxy sait que vous avez l'intention d'implémenter une interface). Quelque chose que j'ai fait dans le passé, dans une situation où vous avez accès à la source du webservice, est d'écrire une petite application qui va analyser le code (sous forme de texte) dans le fichier .asmx.cs du webservice pour extraire les noms de toutes les méthodes marquées avec [WebMethod]. Ensuite, l'application "corrige" le References.cs en insérant des attributs appropriés sur les méthodes mandatées, en fonction de certains fichiers de paramètres ou quelque chose comme ça. Cela fonctionne bien parce que les conventions de nommage dans le proxy correspondent très bien aux noms de méthode dans le service d'origine.

1

Je peux juste finir d'injecter mon SoapExtension en le mettant dans le Web.config. Cela l'amènera à être exécuté à chaque appel WS sans un attribut de méthode de proxy client. Ensuite, je vais modifier l'extension SoapExtension pour rechercher le nom de la méthode WS appelée dans une liste et, si elle figure dans la liste, faire le reste de la logique SoapExtension. Je pense que le succès sur la liste dans cette application de petit volume ne va pas tuer la performance.

-1
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] 
public class CriptoExtensionAttribute : SoapExtensionAttribute 

[CriptoExtension] 
public partial class MainService{ 
+1

Ne fonctionne pas pour moi – Lu55

1

Il y a 6 ans, il a été posté ... Donc je ne sais pas si cela aidera quelqu'un à ce stade.

J'ai rencontré quelque chose de similaire avec un appel à un ancien service Web SOAP qui avait une classe proxy générée dynamiquement que nous ne voulions pas modifier car elle était générée automatiquement à partir du fichier wsdl par le projet. Afin de résoudre ce problème, voici ce que nous avons fait.

  • La classe proxy générée par wsdl.exe est une classe partielle. Nous avons étendu cette classe de manière à ajouter une propriété avec les informations que nous voulions accéder à l'extension de soap. Vous pouvez ajouter autant de propriétés que vous voulez ...

    partial class mysoapwebservice { public string myproperty{ get; set; } }

  • dans le web.config, nous avons enregistré l'extension de savon globaly sur le projet

    <webServices> <soapExtensionTypes> <add type="MySoapExtension" priority="1" group="Low"/> </soapExtensionTypes> </webServices>

  • Dans le code étaient nous avons créé l'objet de service Web 'mysoapwebservice' nous définissons la valeur de la propriété dont nous avions besoin.

  • Dans le soapextension, vous pouvez obtenir une référence au service Web qui a été appelé ainsi que les valeurs.Vous pouvez également déterminer l'appel de la méthode.

`

public class MySoapExtension: SoapExtension 
{ 
    public override void ProcessMessage(SoapMessage message) 
    { 
    switch (message.Stage) 
     { 
      case SoapMessageStage.BeforeSerialize: 
       { 
        // web service client object 
        var webserviceobject= ((SoapClientMessage)message).Client; 
        // method from web service that was called 
        var calledMethod = (SoapClientMessage)message).MethodInfo; 

        // checked the client type of webserviceobject and 
        //added method/property specific logic here 
       } 
     } 
    } 

    // other soap extension code 
} 
Questions connexes