Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
2390 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Problème utilisation Service WCF depuis l'Extérieur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème utilisation Service WCF depuis l'Extérieur

n°1972139
tsoupi
Posté le 09-03-2010 à 09:54:59  profilanswer
 

Bonjour,  
 
Je développe un Service WCF dans le cadre de mon travail. Pour bien vous situer le contexte, mon Service est hébergé sur une machine équipée de Windows Server 2008 R2 avec IIS 7 (WAS).  
 
Mon Service WCF est exposé via 3 endpoints :  
 
- un en SOAP  
- deux en REST : POX et JSON  
 
Voici le fichier de configuration Web.Config du Service :  
 

Code :
  1. <system.serviceModel>
  2. <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  3. <services>
  4. <service name="Solution.WCFService.MonService" behaviorConfiguration="MetadataWSDL">
  5. <host>
  6. <baseAddresses>
  7. <add baseAddress="https://adresse-site"/>
  8. </baseAddresses>
  9. </host>
  10. <endpoint address="SOAP"
  11. binding="basicHttpBinding"
  12. contract="Solution.ServiceContract.IMonService"
  13. bindingConfiguration="soapBinding" />
  14. <endpoint address="POX"
  15. binding="webHttpBinding"
  16. contract="Solution.ServiceContract.IMonService"
  17. behaviorConfiguration="PoxBehavior"
  18. bindingConfiguration="webBinding" />
  19. <endpoint address="JSON"
  20. binding="webHttpBinding"
  21. contract="Solution.ServiceContract.IMonService"
  22. behaviorConfiguration="JsonBehavior"
  23. bindingConfiguration="webBinding" />
  24. </service>
  25. </services>
  26. <!-- bindings -->
  27. <bindings>
  28. <!-- SOAP -->
  29. <basicHttpBinding>
  30. <binding name="soapBinding" >
  31. <security mode="TransportWithMessageCredential" >
  32. <transport clientCredentialType="Basic" />
  33. <message clientCredentialType="UserName" />
  34. </security>
  35. </binding>
  36. </basicHttpBinding>
  37. <!-- REST -->
  38. <webHttpBinding>
  39. <binding name="webBinding">
  40. <security mode="Transport" >
  41. </security>
  42. </binding>
  43. </webHttpBinding>
  44. </bindings>
  45. <!-- behaviors -->
  46. <behaviors>
  47. <endpointBehaviors>
  48. <!-- plain old XML -->
  49. <behavior name="PoxBehavior">
  50. <webHttp />
  51. </behavior>
  52. <!-- JSON -->
  53. <behavior name="JsonBehavior">
  54. <enableWebScript />
  55. </behavior>
  56. </endpointBehaviors>
  57. <serviceBehaviors>
  58. <behavior name="MetadataWSDL">
  59. <serviceCredentials>
  60. <userNameAuthentication customUserNamePasswordValidatorType="Solution.WCFService.CustomUserNameValidator, Solution.WCFService" userNamePasswordValidationMode="Custom" />
  61. </serviceCredentials>
  62. <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
  63. <serviceDebug includeExceptionDetailInFaults="true" />
  64. <dataContractSerializer maxItemsInObjectGraph="6553600"/>
  65. </behavior>
  66. </serviceBehaviors>
  67. </behaviors>
  68. </system.serviceModel>


 
Après avoir placé les bons fichiers sur le Serveur (web.Config, MonService.svc, ...), voilà ce que j'obtient en accédant au Service via IE :  
 

Citation :

Vous avez créé un service.  
 
Pour tester ce service, vous allez devoir créer un client et l’utiliser pour appeler le service. Pour ce faire, vous pouvez utiliser l’outil svcutil.exe à partir de la ligne de commande avec la syntaxe suivante :  
 
svcutil.exe https://nom-machine-et-domaine/MonService.svc?wsdl


 
Le premier problème, c'est que l'adresse indiquée utilise le nom de la machine avec son domaine au lieu de l'adresse du site web. C'est un peu embétant. Comment peut on y remédier ?  
 
Si je modifie l'adresse donnée en remplacant le nom de la machine par l'adresse du site, j'accède bien aux Métadonnées WSDL :  
 
https://adresse-site/MonService.svc?wsdl  
au lieu de  
https://nom-machine-et-domaine/MonService.svc?wsdl  
 
Dans ce fichier WSDL, je peux également remarqué qu'à plusieurs reprises, des adresses utilisent le nom de la machine au lieu de l'adresse du site. Par exemple :  
 

Code :
  1. <wsdl:import namespace="https://adresse-site/MonServices/2010/03" location="https://nom-de-la-machine/MonService.svc?wsdl=wsdl0" />


 
Comment y remédier ?  
 
Le problème est que si j'essaye d'accéder au Service WCF depuis l'extérieur (en local, tout fonctionne), je ne peux pas ajouter de référence avec l'outil de Visual Studio 2008 / 2010. J'ai systèmatiquement une erreur qui semble être causée par les adresses composée de nom-de-la-machine qu'il n'arrive pas à ressoudre. Ca semble normal puisque ces adresses ne sont utilisables que depuis le réseau de l'entreprise.  
 
Voici l'erreur complète indiquée par Visual Studio :  
 

Citation :

The document was understood, but it could not be processed.  
- The WSDL document contains links that could not be resolved.  
- There was an error downloading 'https://nom-de-la-mahcine-et-domaine/MonService.svc?wsdl=wsdl0'.  
- The remote name could not be resolved: 'nom-de-la-mahcine-et-domaine'  
Metadata contains a reference that cannot be resolved: 'https://adresse-site/MonService.svc?wsdl'.  
There was no endpoint listening at https://adresse-site/MonService.svc?wsdl that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.  
The remote server returned an error: (404) Not Found.  
If the service is defined in the current solution, try building the solution and adding the service reference again.


 
La partie suivante semble indiquer que c'est bien l'adresse avec le nom de la machine qui pose problème :  
 

Citation :

The remote name could not be resolved: 'nom-de-la-mahcine-et-domaine'


 
A l'heure actuelle, le Service WCF est donc inutilisable depuis l'extérieur. A noter que j'ai pas essayé de consommer le Service sans générer automatiquement le Proxy.  
 
J'espère que quelqu'un sera en mesure de m'aider. Une de nos idées est de sortir le Serveur du Domaine pour changer son nom afin de lui donner comme nom l'adresse du site. Est-ce une bonne solution ?  
 
Merci d'avance pour votre aide.  
 
A titre informatif, voici des extraits de mon Interface et de son implémentation :  
 
Interface IMonService :
 

Code :
  1. [ServiceContract(Namespace = "https://adresse-site/MonServices/2010/03" )]
  2. public interface IMonService
  3. {
  4. [WebGet()]
  5. [OperationContract()]
  6. WorkIssueResponse<bool> CheckEligibilityCustomer(string CustomerLogin);
  7. ....
  8. }


 
Fichier MonService (implémentation de l'interface) :
 

Code :
  1. [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  2. public class MonService : IMonService
  3. {
  4. public WorkIssueResponse<bool> CheckEligibilityCustomer(string CustomerLogin)
  5. {
  6. return this._DataLayer.CheckEligibilityCustomer(CustomerLogin);
  7. }

mood
Publicité
Posté le 09-03-2010 à 09:54:59  profilanswer
 

n°1972243
Fred82
Posté le 09-03-2010 à 12:59:21  profilanswer
 

J'ai également rencontré ce problème : sur un réseau interne à la boîte, VS traduit bêtement l'adresse que tu lui donnes en adresse locale, du coup ton appli cliente ne peut pas s'exécuter à l'extérieur du réseau interne.

 

La solution se porte sur l'appli cliente.

 

Deux solutions possibles :
1) Quand tu instancies ton proxy client faisant la référence au webservice distant, il faut lui transmettre l'adresse du web service en paramètre de son constructeur, soit dans ton exemple "https://adresse-site/MonService.svc?wsdl=wsdl0".
2) Editer le app.config du projet client et remplacer l'adresse "https://nom-de-la-machine/MonService.svc?wsdl=wsdl0" par la bonne adresse.

 

A propos de ta remarque :
"Le premier problème, c'est que l'adresse indiquée utilise le nom de la machine avec son domaine au lieu de l'adresse du site web. C'est un peu embétant. Comment peut on y remédier ?  "
=> A priori, ce ne sera pas le cas si tu accèdes à cette url depuis le réseau extérieur. Tu peux tester en utilisant un proxy si tu restes sur le réseau interne.

 

Edit : oups, je n'avais pas lu la fin de ton message.


Message édité par Fred82 le 09-03-2010 à 12:59:58

---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1972244
Fred82
Posté le 09-03-2010 à 13:09:29  profilanswer
 

Je viens de lire la fin de ton message qui me dérange un peu :
 
"Le problème est que si j'essaye d'accéder au Service WCF depuis l'extérieur (en local, tout fonctionne), je ne peux pas ajouter de référence avec l'outil de Visual Studio 2008 / 2010. J'ai systèmatiquement une erreur qui semble être causée par les adresses composée de nom-de-la-machine qu'il n'arrive pas à ressoudre. Ca semble normal puisque ces adresses ne sont utilisables que depuis le réseau de l'entreprise.  "
 
Je trouve ça vraiment bizarre.
 
Sur un projet que je fais actuellement, le wsdl contient lui aussi l'adresse interne, ça ne l'empêche pas de fonctionner à l'extérieur. Je génère moi aussi le proxy automatiquement via VS2008. La seule différence, c'est que je modifie l'URL sur le poste client pour qu'il adopte la bonne URL comme indiqué au message précédent.
 
Pour tester un service WCF, tu peux essayer ce logiciel :
http://www.wcfstorm.com/wcf/home.aspx


---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel
n°1972445
Fred82
Posté le 09-03-2010 à 20:58:40  profilanswer
 

J'ai des nouvelles informations à t'apporter.
 
J'ai testé l'ajout de référence au service web depuis l'extérieur du réseau, et surprise, j'ai le même message d'erreur que toi ("The document was understood, but it could not be processed.  ... etc" ). Donc je suis dans le même cas que toi, et même si ma méthode m'a permis de contourner le problème, il reste que mon service WCF n'est pas facilement exploitable par des clients extérieurs non programmés par soi-même.
 
Pour faire court, voici une solution que je viens de trouver :
http://forums.asp.net/p/1096811/1659596.aspx
 
Pas testé mais j'y crois.


---------------
Vos smileys favoris sur HFR : Script Greasemonkey / Topic HFR officiel

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Problème utilisation Service WCF depuis l'Extérieur

 

Sujets relatifs
problème avec requêteProblème de requêtes asynchrones
Problème de paramètre vers une XSLOpenLaszlo/Glassfish Probleme de chargement de media
probleme de SSH2[Easyphp5.1.3] probleme connexion mysql en localhsot
[Résolu] Problème de requêteProblème création site en flash
Probleme Entity sous HibernateProbleme variable fichier [ langage C ]
Plus de sujets relatifs à : Problème utilisation Service WCF depuis l'Extérieur


Hit-Parade
Copyright © 1997-2012 Hardware.fr SARL / Groupe LDLC / LesNumeriques.com / Version anglaise du site: BeHardware