web-dev-qa-db-fra.com

WebHttpBinding avec Http et Https

J'essaie d'utiliser https et http pour le site Web. Le site Web contient des fichiers .svc faisant office de service REST et appelés à partir de JavaScript.

Ma configuration:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="AjaxBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="MyServiceBehaviour">
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceMetadata httpGetEnabled="True" httpsGetEnabled="true"/>         
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <services>
      <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups">
        <endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >         
        </endpoint>
        <endpoint address="" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >          
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
      </service>
    </services>
    <bindings>      
      <webHttpBinding>
        <binding name="httpsWebBinding">
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
        <binding name="httpWebBinding">
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" />
          </security>
        </binding>
      </webHttpBinding>
    </bindings>   
  </system.serviceModel>

Parcourir https: //myserver/services/Lookups.svc/Hello give

Impossible de trouver une adresse de base correspondant au schéma http pour le noeud final avec la liaison WebHttpBinding. Les schémas d'adresses de base enregistrés sont [https]

Parcourir http: //myserver/services/Lookups.svc/Hello give

Impossible de trouver une adresse de base correspondant au schéma https pour le noeud final avec la liaison WebHttpBinding. Les schémas d'adresses de base enregistrés sont [http]

Si je supprime un terminal, cela fonctionne. Exemple de suppression de terminal configuré avec bindingConfiguration="httpWebBinding" fonctionne pour HTTPS, 

Comment puis-je le faire fonctionner avec HTTP et HTTPS? À partir de maintenant, je peux utiliser http ou https en supprimant un point de terminaison.

Référencé Comment puis-je combiner la configuration des services WCF pour http et https dans un fichier web.config? et Comment configurez-vous les services HTTP et HTTPS WCF 4 RESTful?

Remarque : Dans IIS, il s'agit de deux sites Web, l'un à l'écoute sur http et l'autre sur Https. Les deux partagent le même code dans un dossier physique

UPDATE: À partir de maintenant, j'ai supprimé les terminaux et cela fonctionne. Mais ma préoccupation est de supprimer endpoing configuré avec behaviorConfiguration ne semble pas une bonne solution pour moi. 

Cela fonctionne pour http et https

  <services>
      <service behaviorConfiguration="MyServiceBehaviour" name="MyService.Lookups">

      </service>
    </services>
11
Billa

J'ai recréé votre scénario et utilisé votre web.config pour configurer des points de terminaison pour mon service de test. Votre configuration est ok et fonctionne correctement. La partie qui ne fonctionne pas pour vous est probablement votre configuration https dans IIS. Assurez-vous que vous avez activé l'accès https à votre service. Si vous le testez avec IISExpress de Visual Studio, cliquez ensuite sur votre projet et, dans la fenêtre de propriétés (Affichage -> Fenêtre de propriétés), sélectionnez SSL Enabled = True.

5
Lesmian

Ajoutez ce code.

<protocolMapping>
  <add scheme="http"  binding="webHttpBinding" bindingConfiguration="httpWebBinding"/>
  <add scheme="https" binding="webHttpBinding" bindingConfiguration="httpsWebBinding"/>
</protocolMapping>
0
hyunchul kim

Comme @Lesmian l'a souligné dans sa réponse, le problème se trouve dans votre configuration IIS. Plus spécifiquement dans:

Remarque: Dans IIS, il s’agit de deux sites Web, l’un sur http et l’autre sur https. Les deux partagent le même code dans un dossier physique

La raison en est que IIS ne peut pas gérer de points de terminaison sur un schéma non pris en charge. 

Vous avez deux sites, l'un avec liaison HTTP, mais pas avec HTTPS, l'autre avec HTTPS, mais pas avec HTTP. 

Ainsi, lorsque vous accédez à http: // URL, IIS vous dirige vers le site activé par surprise (surprise!), Lit web.config et constate qu'il enregistre https. endpoint (qui n'est pas pris en charge par le site) et lève l'exception en indiquant qu'il n'y a pas de prise en charge de https scheme sur le site http - uniquement activé.

Lorsque vous accédez au https: // URL, la situation est similaire - IIS ne vous permet pas d'utiliser http endpoint sur le https -enabled-only site. 

Pour gérer le problème, il vaut mieux utiliser un seul site avec deux liaisons.

Une autre option (plus complexe) consisterait à utiliser différents sites Web.configs: créez des sites distincts (pointant vers des dossiers distincts) et utilisez les outils de publication et de transformation Web.config de Visual Studio.

0
morincer

Si vous mettez à jour vos configurations de points de terminaison comme ceci:

        <endpoint address="http://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpWebBinding" contract="MyService.Lookups" >         
        </endpoint>
        <endpoint address="https://myserver/services/Lookups.svc" behaviorConfiguration="AjaxBehavior"
          binding="webHttpBinding" bindingConfiguration="httpsWebBinding" contract="MyService.Lookups" >          
        </endpoint>

J'ai fait une danse similaire avec un système de prod et c'était ma solution. J'espère que cela fonctionne pour vous aussi.

0
Jake