none
Attaquer un WS WCF depuis une application Metro RRS feed

  • Question

  • Bonjour à tous,

    J'ai publié un web service WCF de test sur un serveur IIS. Quand je tape l'URL de mon service, mon navigateur me renvoi bien la bonne valeur. Jusque là tout va bien.

    Là où ça se complique, c'est quand j'essaye d'appeler ma méthode depuis mon application Metro (VM W8 VS2012 RC). l'erreur qui se produit est la suivante :

    There was no endpoint listening at http://XX.XX.XX.XX:XXXX/GetTest.svc that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.

    Je n'arrive pas à comprendre d'où peut provenir cette erreur.

    Concernant mon service voilà l'interface :

     [ServiceContract]
        public interface IGetTest
        {
            [OperationContract(Name = "GetTest")]
            [WebInvoke(Method = "GET", UriTemplate = "gettest", BodyStyle = System.ServiceModel.Web.WebMessageBodyStyle.Bare)]
            string methodeGetTest();
        }

    La classe correspondante (le .svc) :

    public class GetTest : IGetTest
        {
            public string methodeGetTest()
            {
                return string.Format("test réussi !");
            }
        }


    Et une grosse partie de mon web.config :

    <system.serviceModel>
        <bindings>
          <webHttpBinding>
            <binding name="SecureBinding">
              <security mode="Transport">
              </security>
            </binding>
          </webHttpBinding>
        </bindings>
    
        <behaviors>
          <endpointBehaviors>
            <behavior name="REST">
              <webHttp />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="Default">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    
        <services>
          <service name="monService.GetTest" behaviorConfiguration="Default">
            <endpoint address="" behaviorConfiguration="REST" binding="webHttpBinding" contract="monService.IGetTest"/>
          </service>
          </services>
      </system.serviceModel>

    Côté client (mon appli metro), j'ai ajouté la référence de service correspondante à mon service web. Les fichiers ont été générés (dont Reference.cs) mais je n'en ai touché aucun.

    la partie qui crash dans mon MainPage.Xaml.cs est la suivante :

    EndpointAddress endpointAddress = new EndpointAddress(new Uri("http://XX.XX.XX.XX:XXXX/GetTest.svc"));
    
                GetTestClient client = new GetTestClient(new NetHttpBinding(), endpointAddress);
    
                string result = await client.GetTestAsync();
                txtBoxTest.Text = result;
    
                await client.CloseAsync();

    L'application plante lors de l'appel de la méthode GetTestAsync().

    Voyez vous quelle pourrait être l'erreur ?

    • Déplacé Aurel Bera jeudi 20 septembre 2012 13:20 (Origine :Développement Windows 8 )
    mercredi 18 juillet 2012 15:35

Toutes les réponses

  • Bonjour,

    Si vous faites une application Metro et que le WebService est disponible via Http, je vous conseille d'utiliser un HttpClient voire même le package Nuget WebAPI Client librairie et d'appeler le webservice par exemple comme cela :

    var http = new HttpClient();

    var resp = await http.GetAsync(new Uri("http://X.X.X.X."));

    var Stream = await resp.Content.ReadAsStreamAsync();

    Puis de parser votre Stream retourné selon le type (json, xml etc...).


    Mathieu Notin

    • Proposé comme réponse sandørMVP lundi 26 novembre 2012 01:55
    mardi 20 novembre 2012 21:52
  • Radicalement contre la réponse de Mathieu (désolé mais je vois pas l'intérêt).

    Concernant votre code, soit vous utilisez le fichier de config, soit vous configurez votre service via le fichier de config. dans votre code, vous avez choisi les 1ere solution mais je pense qu'il manque des éléments.

    Essayez d'utiliser le fichier de config dans un premier temps (il faut ajouter l'uri dans un projet Metro, il ne le fait pas automaitquement/VS 2010).


    Richard Clark
    Consultant - Formateur .NET
    http://www.c2i.fr
    Depuis 1996: le 1er site .NET francophone

    mercredi 21 novembre 2012 06:22
  • Hello,

    Richard, sauf erreur de ma part, j'ai l'impression que tu as lu le fichier de config de l'OP un peu rapidement? Il n'utilise pas NetHttpBinding (qui est un protocole à part) mais webHttpBinding qui expose un service REST (json ou xml). Il est donc naturel de consommer cet api au travers d'un client Http et d'un parsing json (soit via DataContractJsonSerializer, ou direcement JsonObject) comme l'indique Matthieu.

    Cordialement,


    Cyprien Autexier



    • Modifié sandørMVP lundi 26 novembre 2012 01:56
    lundi 26 novembre 2012 01:55