IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Services Web Discussion :

[C# 2.0] Appel dynamique de service Web


Sujet :

Services Web

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 13
    Points
    13
    Par défaut [C# 2.0] Appel dynamique de service Web
    Bonjour,

    j'essaie dans mon code C# de faire appel à un webservice dont l'url et le nom de la méthode me sont passés en paramètres.
    Je pensais procéder comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    SWTEST.ServiceTest MySW = new SWTEST.ServiceTest();
    MySW.Url = strAdresse;
    Type oType = MySW.GetType();
     
    // On va récupérer la liste des méthodes qui existent dans le service web
    System.Reflection.MethodInfo[] ListMethods = oType.GetMethods();
    object objVal = null;
    // Pour chaque méthode :
    foreach (System.Reflection.MethodInfo mi in ListMethods)
    {
           // Si le nom de la méthode est égale à strFonctionSW
           if (mi.Name.ToUpper().Equals(strFonctionSW.ToUpper()))
           {
                  objVal = mi.Invoke(MySW, new object[] { "monparam"});
                  // On sort de la boucle foreach
                  break;
           }
    }
    SWTEST.ServiceTest est le webService "par défaut" que j'ai ajouté comme référence à mon projet.

    Le problème c'est que après avoir changé l'URl, la liste des méthodes reste celle de mon servicetest donc je ne fais jamais le invoke...

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Je ne comprends pas : si ta méthode n'appartient pas à la classe ServiceTest pourquoi balaye tu cette classe pour la trouver ??? (ou dit autrement si ton webservice n'expose pas une classe ServiceTest pourquoi chercher une méthode dedans ?)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Ben en fait j'ai découvert que si mon service test et le nouveau service possède tous les deux la méthode nommée strFonctionSW je vais bien m'arrêter dans mon foreach et appeler la bonne méthode.
    Mais je suis concient que ça ne va pas car je ne connaitrai pas à l'avance les méthodes à appeler.
    En fait ce que je cherche c'est plutôt une autre solution, une qui marche tout le temps.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Après pas mal de recherche j'ai totalement revu ma solution. Voici la classe que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     internal class WsProxy
        {
            [SecurityPermissionAttribute(SecurityAction.Demand, Unrestricted = true)]
            internal static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args)
            {
                try
                {
                    System.Net.WebClient client = new System.Net.WebClient();
     
                    client.Headers.Clear();
                    //-Connect To the web service
                    System.IO.Stream stream = client.OpenRead(@webServiceAsmxUrl + "?wsdl");
     
                    //--Now read the WSDL file describing a service.
                    ServiceDescription description = ServiceDescription.Read(stream);
     
                    ///// LOAD THE DOM /////////
                    //--Initialize a service description importer.
                    ServiceDescriptionImporter importer = new ServiceDescriptionImporter();
                    //importer.ProtocolName = "Soap12"; // Use SOAP 1.2.
                    importer.AddServiceDescription(description, null, null);
                    //--Generate a proxy client. 
                    importer.Style = ServiceDescriptionImportStyle.Client;
                    //--Generate properties to represent primitive values.
                    importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties;
                    //--Initialize a Code-DOM tree into which we will import the service.
                    CodeNamespace nmspace = new CodeNamespace();
                    CodeCompileUnit unit1 = new CodeCompileUnit();
                    unit1.Namespaces.Add(nmspace);
                    //--Import the service into the Code-DOM tree. This creates proxy code
                    //--that uses the service.
                    ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1);
                    if (warning == 0) //--If zero then we are good to go
                    {
                        //--Generate the proxy code 
                        CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp");
                        //--Compile the assembly proxy with the appropriate references
                        string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" };
                        CompilerParameters parms = new CompilerParameters(assemblyReferences);
                        CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1);
                        //-Check For Errors
                        if (results.Errors.Count > 0)
                        {
                            foreach (CompilerError oops in results.Errors)
                            {
                                System.Diagnostics.Debug.WriteLine("========Compiler error============");
                                System.Diagnostics.Debug.WriteLine(oops.ErrorText);
                            }
                            throw new System.Exception("Compile Error Occured calling webservice. Check Debug ouput window.");
                        }
                        //--Finally, Invoke the web service method 
                        object wsvcClass = results.CompiledAssembly.CreateInstance(serviceName);
                        System.Reflection.MethodInfo mi = wsvcClass.GetType().GetMethod(methodName);
                        return mi.Invoke(wsvcClass, args);
                    }
                    else
                    {
                        return null;
                    }
                }
                catch (Exception e)
                {
                    serviceActionsExternes._logger.Error("CallWebService " + e.Message);
                    return null;
                }
            }
        }
    J'ai dû commenté la ligne importer.ProtocolName = "Soap12"; car ça ne marchait qu'avec un webservice créé avec le framework 2.0, je ne sais pas trop pourquoi mais en ne précisant pas le protoclName ça marche dans tous les cas que j'ai testé.

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    En effet, c'est à bookmarker ton truc

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Appel dynamique d'un web service
    Par Kery971 dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 30/04/2012, 16h43
  2. appel d'un service web via ajax
    Par majda_afkir dans le forum Services Web
    Réponses: 0
    Dernier message: 20/05/2009, 03h33
  3. Appel d'un service web d'un autre site
    Par JinenSoftware dans le forum Services Web
    Réponses: 0
    Dernier message: 25/02/2009, 08h26
  4. appel d'un service web
    Par soumaa dans le forum Services Web
    Réponses: 2
    Dernier message: 28/04/2007, 21h16
  5. Appel d'un service Web
    Par REMACC1 dans le forum Access
    Réponses: 2
    Dernier message: 12/09/2006, 13h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo