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 :

Mise en place 1er service wcf sur serveur distant


Sujet :

Services Web

  1. #1
    Membre à l'essai
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Mise en place 1er service wcf sur serveur distant
    Bonjour,

    Je mets en place mon premier service wcf et je galère à appeler ma méthode depuis le serveur sous lequel le service est hébergé. Lorsque j'essaye d'appeler ma méthode, rien ne se passe. Dans l'interface cliente j'arrive jusqu'au niveau de la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                        channel.positionsgps();
    J'ai l'impression d'appeler ma méthode en local. Mon Web.Config est configuré de la manière suivante:
    Code XML : 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
    <?xml version="1.0"?>
    <configuration>
      <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="BasicHttpBinding_IService1"/>
          </basicHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://ks397287.kimsufi.com:8898/service1/Service1.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="WcfService1.IService1" name="BasicHttpBinding_IService1"/>
        </client>
      </system.serviceModel>
      <system.web>
        <compilation debug="true"/>
      </system.web>
    </configuration>
    .

    Dans le fichier IService1.cs, j'appelle ma méthode de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [ServiceContract]
        public interface IService1
        {
     
            [OperationContract]
             List<string> positionsgps();
    Le fichier Service1.svc:
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
        public class Service1 : IService1
        {
            public List<string> positionsgps()
            {
                string results = "";
                string pathtest = "";
                string[] donnees = new string[6];
                DirectoryInfo diTop = new DirectoryInfo(@"C:\log\");
                Dictionary<int, string> valeurs = new Dictionary<int, string>();
                List<string> lat = new List<string>();
                List<string> lon = new List<string>();
                List<string> name = new List<string>();
                List<string> resultats = new List<string>();
                try
                {
                    foreach (var di in diTop.EnumerateDirectories("*"))
                    {
                        try
                        {
                            foreach (var fi in di.GetFiles("*", SearchOption.AllDirectories))
                            {
                                if (!(fi.FullName.Contains("prog.csv")) && !(fi.FullName.Contains("trameNonGere.csv")))
                                {
                                    string[] lines = System.IO.File.ReadAllLines(fi.FullName);
     
                                    long FindLastLinePosition(BinaryReader br3, long start)
                                    {
                                        br3.BaseStream.Position = start;
                                        char current = br3.ReadChar();
                                        while (!(current.Equals('\n')))
                                        {
                                            start -= 1;
                                            br3.BaseStream.Position = start;
                                            current = br3.ReadChar();
                                        }
                                        return (start + 1);
                                    }
                                    long WithoutReturnPosition(BinaryReader br2)
                                    {
                                        long index = br2.BaseStream.Length - 1;
                                        br2.BaseStream.Position = index;
                                        int current = (int)br2.ReadChar();
                                        while ((current == 10) || (current == 13))
                                        {
                                            index -= 1;
                                            br2.BaseStream.Position = index;
                                            current = (int)br2.ReadChar();
                                        }
                                        return (index - 1);
                                    }
     
                                    string path = fi.FullName;
                                    BinaryReader br = null;
                                    StreamReader sr = null;
                                    long position;
     
                                    br = new BinaryReader(File.Open(path, FileMode.Open));
                                    position = WithoutReturnPosition(br);
                                    position = FindLastLinePosition(br, position);
                                    br.Close();
                                    sr = new StreamReader(File.Open(path, FileMode.Open));
                                    sr.BaseStream.Position = position;
                                    MatchCollection matches = Regex.Matches(sr.ReadLine(), "(?<val>.*[;])(?<date>[0-9]*[/][0-9]*[/][0-9]{4}.)(?<heu>[0-9]{2}[:][0-9]{2})(?<mes>.*[OK][;][0-9]*[;])(?<nom>.*)(?<reseau>[;].*)(?<autre>[;].*[;].*[;].*)(?<lat>[1-3]{1}[.][0-9]*)(?<vir>[,])(?<lon>[3-5]{1}[7-9]{1}[.][0-9]*)", RegexOptions.ExplicitCapture);
                                    foreach (Match match in matches)
                                    {
                                        results = di.Name.Replace("_", "/") + " " + fi.Name.Substring(0, 10) + "  " + match.Groups["date"].Value + "  " + match.Groups["heu"].Value + "  " + match.Groups["nom"].Value + "  " + match.Groups["lat"].Value + "  " + match.Groups["lon"].Value;
                                        Console.WriteLine(sr.ReadLine() + " " + results);
                                        donnees[1] = match.Groups["nom"].Value;
                                        donnees[2] = match.Groups["lat"].Value.ToString();
                                        donnees[3] = match.Groups["lon"].Value.ToString();
     
                                        if (!(name.Contains(donnees[1]) && lon.Contains(donnees[3]) && lat.Contains(donnees[2])))
                                        {
                                            lat.Add(donnees[2]);
                                            lon.Add(donnees[3]);
                                            name.Add(donnees[1]);
                                        }
                                        resultats.Add(results);
     
                                    }
                                    int row = 0;
                                    int rowIndex = 0;
                                    XElement document = new XElement("Document");
                                    for (row = 0; row < name.Count; row++)
                                    {
                                        if (rowIndex <= name.Count)
                                        {
                                            rowIndex++;
                                            if (lat.ToString() != "" && lon.ToString() != "")
                                            {
                                                document.Add(
                                                new XElement("Placemark",
                                                new XElement("name", name[row]),
                                                new XElement("Point",
                                                new XElement("coordinates", lat[row] + "," + lon[row]
                                            ))));
                                            }
                                        }
                                    }
                                    pathtest = @"C:\TDE\WcfService1\position_gps.kml";
                                    System.IO.File.WriteAllText(pathtest, document.ToString());
    WebClient wc = new WebClient();
                wc.DownloadFile("http://ks397287.kimsufi.com:8898/position_gps.kml", "C:\\log\\position_gps.kml");
     
                                    sr.Close();
                                }
                            }
                        }
                        catch (UnauthorizedAccessException unAuthSubDir)
                        {
                            Console.WriteLine($"unAuthSubDir: {unAuthSubDir.Message}");
                        }
                    }
     
                }
                catch (DirectoryNotFoundException dirNotFound)
                {
                    Console.WriteLine($"{dirNotFound.Message}");
                }
     
                catch (UnauthorizedAccessException unAuthDir)
                {
                    Console.WriteLine($"unAuthDir: {unAuthDir.Message}");
                }
     
                catch (PathTooLongException longPath)
                {
                    Console.WriteLine($"{longPath.Message}");
                }
                return resultats;
            }
    Et depuis l'interface utilisateur, voici comment j'appelle ma méthode:
    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
    static void Main(string[] args)
            {
                WebServiceHost host = new WebServiceHost(typeof(Service1));
                try
                {
                    ServiceEndpoint ep = host.AddServiceEndpoint(typeof(WcfService1.IService1), new BasicHttpBinding(), "http://ks397287.kimsufi.com:8898/service1/Service1.svc");
                    host.Open();
     
                    using (ChannelFactory<WcfService1.IService1> cf = new ChannelFactory<WcfService1.IService1>(new BasicHttpBinding(), "http://ks397287.kimsufi.com:8898/service1/Service1.svc"))
                    {
     
                        WcfService1.IService1 channel = cf.CreateChannel();
                        channel.positionsgps();
    ...
     host.Close();
    Fichier service1.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface IService1
    {
     
        [System.ServiceModel.OperationContractAttribute(Action = "http://ks397287.kimsufi.com:8898/service1/Service1.svc/positiongps", ReplyAction = "http://ks397287.kimsufi.com:8898/service1/Service1.svc/positiongps")]
        List<string> positionsgps();
     
     
    }
    Déjà est-ce que ces éléments vous semblent corrects? D'avance merci beaucoup pour vos réponses.

    Elodie

  2. #2
    Membre à l'essai
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Question supplémentaire
    J'ai maintenant le message d'erreur suivant en appelant la méthode de mon web service:
    L'adressage manuel est activé sur cette fabrique : tous les messages envoyés doivent donc être préalablement adressés.
    Voici le contenu de mon web.config:
    Code XML : 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
    <?xml version="1.0"?>
    <configuration>
      <system.serviceModel>
    <services>
                <service name="WcfService1.Service1" behaviorConfiguration="MyServiceTypeBehaviors" >
                    <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
            <endpoint address="/service1/"
                      binding="webHttpBinding" 
                      contract="WcfService1.IService1"/>
                </service>
            </services>
     
            <behaviors>
                <serviceBehaviors>
                    <behavior name="MyServiceTypeBehaviors" >
                                          <serviceMetadata httpGetEnabled="true" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
     
        <bindings>
    <webHttpBinding>
            <binding name="BasicHttpBinding" crossDomainScriptAccessEnabled="true" />
          </webHttpBinding>
              </bindings>  
      <serviceHostingEnvironment multipleSiteBindingsEnabled="true" >  
      </serviceHostingEnvironment>   
        <client>
          <endpoint address="/service1/" binding="webHttpBinding" bindingConfiguration="BasicHttpBinding_IService1" contract="WcfService1.IService1" name="BasicHttpBinding"/>
        </client>
      </system.serviceModel>
      <system.web>
        <compilation debug="true"/>
      </system.web>
    </configuration>
    Je précise, j'ai cette erreur en utilisant un WebHttpBinding
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       ServiceEndpoint ep = host.AddServiceEndpoint(typeof(WcfService1.IService1), new WebHttpBinding(), "http://ks397287.kimsufi.com:8898/service1/");
    Si j'utilise BasicHttpBinding, on me dit que la méthode n'est pas autorisée.
    Si quelqu'un a déjà rencontré le problème, merci d'avance.

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Attention car en passant de basicHttpBinding a webHttpBinding tu changes completement la facon dont ton service web communique : basicHttpBinding utilise SOAP, alors que webHttpBinding utilise REST.

    Il faut donc deja que tu choisisses ce que tu souhaites utiliser pour communiquer avec ton service Web, et que tu nous l'indique.
    Peux-tu aussi preciser quelle version du .NET Framework tu utilises ?

    En allant sur l'URL que tu as indique dans ta config, j'obtiens une erreur du serveur. Il faudrait d'abord resoudre ca avant d'aller plus loin



    Note : tu peux aussi te simplifier la vie en utilisant l'assistant de Visual Studio ou bien Svcutil.exe pour te generer un proxy automatiquement. Tu pourras ainsi regarder le code qui est genere. Pour cela tu peux utiliser le ServiceModel Metadata Utility Tool (Svcutil.exe), avec une commande du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    svcutil http://ks397287.kimsufi.com:8898/service1.svc /out:TonProxy.cs
    En general on utilise la ChannelFactory quand on controle a la fois le client et le serveur, donc qu'on dispose des interfaces en local. Si on ne controle que le client, alors il est preferable de generer un proxy, puisqu'on ne dispose pas des interfaces necessaires en local. De meme pour debuter, il est plus simple de commencer avec un proxy.

    Aussi un peu de lecture interessante sur WCF pour renforcer tes connaissances : WCF Interview Questions – Part 2.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Membre à l'essai
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2016
    Messages : 18
    Points : 13
    Points
    13
    Par défaut Re
    Merci pour la réponse et pour la lien pour la doc. Je suis passée par une classe proxy et ça fonctionne très bien. Je suis passée par un service web asp.net. Je vais toutefois me pencher sur le lien fourni pour réussir la mise en place d'un service web wcf.

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/02/2014, 09h23
  2. [batch] [services windows] état service sur serveur distant
    Par Deadpool dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 16/03/2009, 18h50
  3. [samba/ldap]Mise en place d'une corbeille sur un NAS!
    Par flavio_dev dans le forum Linux
    Réponses: 1
    Dernier message: 11/08/2008, 15h25
  4. Réponses: 1
    Dernier message: 28/05/2008, 18h00
  5. [FLASH 8][AS2][OFFLINE]Mise en place d'un Listener sur un combobox
    Par -=OAZ=- dans le forum ActionScript 1 & ActionScript 2
    Réponses: 0
    Dernier message: 27/03/2008, 11h18

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