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 :
- <system.serviceModel>
- <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
- <services>
- <service name="Solution.WCFService.MonService" behaviorConfiguration="MetadataWSDL">
- <host>
- <baseAddresses>
- <add baseAddress="https://adresse-site"/>
- </baseAddresses>
- </host>
- <endpoint address="SOAP"
- binding="basicHttpBinding"
- contract="Solution.ServiceContract.IMonService"
- bindingConfiguration="soapBinding" />
- <endpoint address="POX"
- binding="webHttpBinding"
- contract="Solution.ServiceContract.IMonService"
- behaviorConfiguration="PoxBehavior"
- bindingConfiguration="webBinding" />
- <endpoint address="JSON"
- binding="webHttpBinding"
- contract="Solution.ServiceContract.IMonService"
- behaviorConfiguration="JsonBehavior"
- bindingConfiguration="webBinding" />
- </service>
- </services>
- <!-- bindings -->
- <bindings>
- <!-- SOAP -->
- <basicHttpBinding>
- <binding name="soapBinding" >
- <security mode="TransportWithMessageCredential" >
- <transport clientCredentialType="Basic" />
- <message clientCredentialType="UserName" />
- </security>
- </binding>
- </basicHttpBinding>
- <!-- REST -->
- <webHttpBinding>
- <binding name="webBinding">
- <security mode="Transport" >
- </security>
- </binding>
- </webHttpBinding>
- </bindings>
- <!-- behaviors -->
- <behaviors>
- <endpointBehaviors>
- <!-- plain old XML -->
- <behavior name="PoxBehavior">
- <webHttp />
- </behavior>
- <!-- JSON -->
- <behavior name="JsonBehavior">
- <enableWebScript />
- </behavior>
- </endpointBehaviors>
- <serviceBehaviors>
- <behavior name="MetadataWSDL">
- <serviceCredentials>
- <userNameAuthentication customUserNamePasswordValidatorType="Solution.WCFService.CustomUserNameValidator, Solution.WCFService" userNamePasswordValidationMode="Custom" />
- </serviceCredentials>
- <serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />
- <serviceDebug includeExceptionDetailInFaults="true" />
- <dataContractSerializer maxItemsInObjectGraph="6553600"/>
- </behavior>
- </serviceBehaviors>
- </behaviors>
- </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 :
- <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 :
- [ServiceContract(Namespace = "https://adresse-site/MonServices/2010/03" )]
- public interface IMonService
- {
- [WebGet()]
- [OperationContract()]
- WorkIssueResponse<bool> CheckEligibilityCustomer(string CustomerLogin);
- ....
- }
|
Fichier MonService (implémentation de l'interface) :
Code :
- [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
- public class MonService : IMonService
- {
- public WorkIssueResponse<bool> CheckEligibilityCustomer(string CustomerLogin)
- {
- return this._DataLayer.CheckEligibilityCustomer(CustomerLogin);
- }
|