none
Problème deploiement Web Service RRS feed

  • Question

  • Bonjour,

    J'ai developpé un web service WCF avec une liaison WSDualHttpBinding et qui utilise l'authentification via userName / password et la classe UserNamePasswordValidator.

    J'ai également développé une appli cliente qui appel le web service pour s'authentifier et qui passe donc par ma méthode "validate".

    Tous fonctionne très bien en local.

    J'ai fait un test de deploiement : 

    - Web service + appli cliente sur la même machine (=tous va bien)

    - Web service + appli cliente sur une autre machine (=échec)

    J'arrive pourtant de mon appli cliente sur une autre machine à accéder à mon web service, j'arrive à afficher le fichier wsdl et aucune erreur ne m'est retourné lorsque j'appelle une méthode de mon web service sauf un time out me signalant que le temps d'attente de la réponse est dépassé.

    J'ai donc attaché visual studio au processus de mon web service pour le debuguer et refait un test de connexion en local (dans ce cas tous ce passe bien et je passe dans ma méthode validate), puis je refait un test depuis mon autre machine et là rien ne se passe (je ne passe jamais dans ma méthode validate et ne retourne jamais aucune réponse).

    N'ayant aucun message d'erreur je n'arrive pas à cerner le problème. Si vous auriez des pistes de réflexion à me faire par je suis preneuse.

    Merci d'avance.

    mercredi 24 avril 2013 15:37

Réponses

  • Bon après multiple test j'ai pu comprendre comment cela fonctionnait et finir par trouver d'où venait le problème.

    J'ai dans un premier temps constater que les heures affichées dans les logs sont une conversion des heures des machines à l'heure UTC pour éviter à la base les problème de changement d'heure.

    J'ai suite à ça remarqué que la case à coché pour prendre en compte l'heure d'été et l'heure d'hiver avait également une incidence dans la conversion de l'heure.

    J'ai donc arrêté d'essayer d'ajuster l'heure manuellement et laisser tous les système de synchronisation sur la machine où il y a le web service. J'ai remarqué que lorsque je faisait un update de l'heure pour qu'elle se mette à jour elle prenait la même heure que ma machine mais que au bout de environ 3 minutes l'heures été modifiés automatiquement par je ne savais quel processus.

    Cette machine étant une machine géré par un hyper V, j'ai pu constaté avec l'administrateur que c'était l'hyper V qui été mal réglé et qui modifié automatiquement mes heures avec une heures de décalages !

    Et voilà, fin de l'histoire maintenant tous fonctionne. =)
    • Marqué comme réponse Aurel Bera mardi 30 avril 2013 11:30
    lundi 29 avril 2013 09:58

Toutes les réponses

  • Bonjour

    Vous pourrez voir le lien suivant :

    http://msdn.microsoft.com/en-us/library/system.servicemodel.wsdualhttpbinding.aspx


    Tawory SOLUTIONS
    www.tawory.com
    www.adidov.com
    said@tawory.com

    mercredi 24 avril 2013 18:15
  • Bonjour

    Un petit retour SVP?

    Merci

    Cordialement,:)


    Tawory SOLUTIONS
    www.tawory.com
    www.adidov.com
    said@tawory.com

    mercredi 24 avril 2013 18:17
  • Effectivement, 

    Le problème pourrait venir du fait que je ne prend pas en compte la propriété "clientbaseadress".

    Juste une petite question pour être sûre de bien comprendre. Cette propriété doit être complété dans le fichier de configuration client ?

    Cela implique que coté client, il faut prévoir d'ouvrir un port particulier pour le web service ?

    jeudi 25 avril 2013 06:53
  • J'ai fait un test en conservant la configuration initiale de mon serveur qui est celle ci :

    <system.serviceModel>
        <services>
          <service name="WS.ServiceProduits" behaviorConfiguration="behaviorConfig">
            <endpoint address="" binding="wsDualHttpBinding" bindingConfiguration="wsDualHttp" contract="WS.Interface.IProduits">
              <identity>
                <dns value="CertServerProduits"/>
              </identity>
            </endpoint>
          </service>
        </services>
        <bindings>
          <wsDualHttpBinding>
            <binding name="wsDualHttp">
              <security mode="Message">
                <message clientCredentialType="UserName" />            
              </security>
            </binding>
          </wsDualHttpBinding>
        </bindings>
    <behaviors>
          <serviceBehaviors>
            <behavior name="behaviorConfig">
              <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
              <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
              <serviceDebug includeExceptionDetailInFaults="true" />
              <serviceCredentials>
                <clientCertificate>
                  <authentication certificateValidationMode="None" revocationMode="NoCheck" />
                </clientCertificate>
                <serviceCertificate storeName="My" storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="CertServerProduits" />
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WS.CustomUserNameValidator, WS" />
              </serviceCredentials>
              <serviceAuthorization principalPermissionMode="Custom">
                <authorizationPolicies>
                  <add policyType="WS.CustomAuthorizationPolicy, WS" />
                </authorizationPolicies>
              </serviceAuthorization>
            </behavior>
          </serviceBehaviors>
        </behaviors>

    Et j'ai modifié mon fichier de configuration client de la façon suivante, pour utiliser la propriété clientbaseadress :

            <bindings>
                <wsDualHttpBinding>
                    <binding name="WSDualHttpBinding_Config"  clientBaseAddress="http://IPClient:8085/">
                        <security>
                            <message clientCredentialType="UserName" />
                        </security>
                    </binding>
                </wsDualHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://IPServer/WS/ServiceProduits.svc" behaviorConfiguration="myClientBehavior"
                    binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_Config"
                    contract="ServiceReference1.Produits" name="WSDualHttpBinding_Produits">
                    <identity>
                        <dns value="CertServerProduits" />
                    </identity>
                </endpoint>
            </client>
          <behaviors>
            <endpointBehaviors>
              <behavior name="myClientBehavior">
                <clientCredentials>
                  <serviceCertificate>
                    <authentication certificateValidationMode="None" revocationMode="NoCheck"/>
                  </serviceCertificate>
                </clientCredentials>
              </behavior>
            </endpointBehaviors>
          </behaviors>

    Mais je n'ai aucun changement de comportement dans mon application client. J'ai toujours un retour timeout !

    Note : (j'ai fait le test en désactivant le firewall coté client et coté serveur).

    jeudi 25 avril 2013 08:32
  • Bonjour

    Vous pourrez utiliser des adresse IP. et meme teste assure la connexion entre les deux machine


    Tawory SOLUTIONS
    www.tawory.com
    www.adidov.com
    said@tawory.com

    jeudi 25 avril 2013 09:56
  • C'est ce que j'ai fait et quand je tape l'url http://***.***.**.***/WS/ServiceProduits.svc dans l'explorateur de ma machine cliente j'accede sans aucun problème au fichier wsdl.
    jeudi 25 avril 2013 10:29
  • Bonjour,

    Est-ce que votre service WCF est hébergé dans une application ASP .NET ?

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance
    Blog : http://gilles.tourreau.fr
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0

    jeudi 25 avril 2013 23:09
    Modérateur
  • Non, et dans visual studio, j'ai utilisé le projet "WCF Service Application" pour le créer.
    vendredi 26 avril 2013 06:56
  • Aaaahhhh !!

    Je viens de découvrir la cause de tout ça !! J'ai fini par activer les traces avec system.diagnostics.
    Dans le fichier de log, j'ai vu le message d'erreur suivant :

    The security timestamp is stale because its expiration time ('2013-04-26T09:34:21.303Z') is in the past. Current time is '2013-04-26T10:29:14.375Z' and allowed clock skew is '00:05:00'.

    Je suis donc allée voir l'heure indiqué sur ma machine du web service et j'ai constaté qu'on avait une heure de décalage entre celle ci et ma machine !
    J'ai donc changé l'heure de la machine du web service et là !! Surprise tout fonctionne à nouveau !

    Je ne pensais pas du tout que ceci pouvait poser problème ! Comment sont gérés les web services appelés depuis l'étranger avec des décalages horaires importants ?
    Y a t'il un paramétrage a effectué pour éviter ce genre de conflit ?
    vendredi 26 avril 2013 09:54
  • Bon après multiple test j'ai pu comprendre comment cela fonctionnait et finir par trouver d'où venait le problème.

    J'ai dans un premier temps constater que les heures affichées dans les logs sont une conversion des heures des machines à l'heure UTC pour éviter à la base les problème de changement d'heure.

    J'ai suite à ça remarqué que la case à coché pour prendre en compte l'heure d'été et l'heure d'hiver avait également une incidence dans la conversion de l'heure.

    J'ai donc arrêté d'essayer d'ajuster l'heure manuellement et laisser tous les système de synchronisation sur la machine où il y a le web service. J'ai remarqué que lorsque je faisait un update de l'heure pour qu'elle se mette à jour elle prenait la même heure que ma machine mais que au bout de environ 3 minutes l'heures été modifiés automatiquement par je ne savais quel processus.

    Cette machine étant une machine géré par un hyper V, j'ai pu constaté avec l'administrateur que c'était l'hyper V qui été mal réglé et qui modifié automatiquement mes heures avec une heures de décalages !

    Et voilà, fin de l'histoire maintenant tous fonctionne. =)
    • Marqué comme réponse Aurel Bera mardi 30 avril 2013 11:30
    lundi 29 avril 2013 09:58