Erreur : aucun point de terminaison n’écoutait…

la programmation


WCF et HTTPS, erreur : aucun point de terminaison n’écoutait. Cela est souvent dû à une adresse incorrecte ou à une action SOAP.

J’essaie de configurer un service WCF pour qu’il fonctionne via HTTPS et je rencontre de nombreux problèmes.

J’implémentais https sur mon serveur de développement avec un certificat auto-signé, tout a bien fonctionné. Lorsque je suis passé en production, toutes les valeurs des URL étaient lues avec le nom du serveur au lieu de l’adresse de mon site Web.

J’ai ajouté un en-tête d’hôte à HTTPS sur mon serveur Web, ce qui devrait me permettre d’éviter d’utiliser des wsdl et xsd statiques, mais ce n’est pas le cas. Sans valeurs statiques, toutes les URL portent par défaut le nom du serveur.

J’ai donc configuré le service pour avoir des fichiers wsdl et xsd statiques qui contiennent tous https dans leur adresse. J’ai ensuite copié ces fichiers dans le répertoire de mon site Web afin qu’ils soient hébergés. Ces fichiers sont hébergés sur mon site Web et les adresses utilisées sont toutes résolues correctement.

Dans mon wsdl pour mon adresse soad, j’ai une valeur avec https. La valeur https provoque une erreur. Quand je remplace https par http, le service fonctionne mais quand

Je vérifie avec Wire Shark que les données ne sont pas cryptées. Pas bon.
Comment puis-je faire fonctionner cela ?

J’ai un projet de test que je peux soumettre pour test.
Voici l’erreur que je reçois :

There was no endpoint listening at https://MYSERVICE/GpTest/Service1.svc 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
Server stack trace:
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at TestWcfHttps1Caller.ServiceReference1.IService1.DoAddition(Int32 value1, Int32 value2)
   at TestWcfHttps1Caller.ServiceReference1.Service1Client.DoAddition(Int32 value1, Int32 value2) in C:\www\releases\Test\WCF\TestWcfHttps1Caller\Service References\ServiceReference1\Reference.cs:line 123
   at TestWcfHttps1Caller._Default.Page_Load(Object sender, EventArgs e) in C:\www\releases\Test\WCF\TestWcfHttps1Caller\Default.aspx.cs:line 15
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnLoad(EventArgs e)
   at System.Web.UI.Control.LoadRecursive()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Solution 1

Je l’ai fait fonctionner, il a fallu une combinaison de trois solutions différentes

1. Activer l’en-tête de l’hôte HTTPS
2. Activer les fichiers wsdl et xsd statiques
3. Configurez web.config

Donc, pour activer HTTPS pour WCF, j’ai dû

1. Créez des fichiers wsdl et xsd statiques

OK, comment?
1.1 en suivant le lien ?wsdl et enregistrez-le sous le type de fichier .wsdl. Modifiez le fichier et changez l’adresse soad en https. Vous créerez un lien vers ce fichier depuis votre serveur de développement puisque votre serveur en direct aura très probablement un lien vers le nom du serveur et non vers l’URL que vous souhaitez réellement utiliser.
1.2 dans le fichier .wsdl, créez un fichier .xsd pour chaque lien xsd dans le wsdl (c’est-à-dire : xsd0.xsd, xsd1.xsd, xsd2.xsd)
1.3 mettez à jour toutes les références aux documents xsd dans le fichier wsdl et les fichiers xsd pour utiliser les nouveaux fichiers xsd que vous avez créés. Pointez sur les valeurs hébergées en utilisant l’URL que vous souhaitez utiliser, toutes les adresses devraient maintenant utiliser https
1.3 hébergez tous ces fichiers à la racine de votre application Web et testez que chaque URL se résout correctement
1.4 Remarque : chaque fois que vous apportez des modifications au service, vous devrez reconstruire tous les fichiers statiques de cette manière.

2. Activez l’en-tête d’hôte HTTPS sur le serveur IIS en direct (pas d’interface graphique pour cela, vous devez utiliser la ligne de commande)

3. Modifiez la configuration Web du service pour inclure le mode Transport Security et HTTPS dans les attributs suivants (recherchez « https » dans web.config ci-dessous)

Voici mon fichier web.config

XML
<system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="TransportSecurity">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service  behaviorConfiguration="TestWcfHttps1.Service1" name="TestWcfHttps1.Service1">
        <endpoint address="https://MYSERVER/GpTest/Service1.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="TransportSecurity"
                  contract="TestWcfHttps1.IService1">
          <identity>
            <dns value="" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="TestWcfHttps1.Service1">
          <serviceMetadata httpsGetEnabled="true" externalMetadataLocation="https://MYSERVER//GpTest/Service1.wsdl" />
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

コメント

タイトルとURLをコピーしました