web-dev-qa-db-fra.com

Comment corriger "n'a pas pu trouver une adresse de base qui correspond au schéma http" ... dans WCF

J'essaie de déployer un service WCF sur mon serveur, hébergé dans IIS. Naturellement, cela fonctionne sur ma machine :)

Mais lorsque je le déploie, j'obtiens l'erreur suivante:

Cette collection contient déjà une adresse avec le schéma http. Il peut y avoir au plus une adresse par schéma dans cette collection.

Sur Google, je trouve que je dois mettre un élément serviceHostingEnvironment dans le fichier web.config:

<serviceHostingEnvironment>
  <baseAddressPrefixFilters>
    <add prefix="http://mywebsiteurl"/>
  </baseAddressPrefixFilters>
</serviceHostingEnvironment>

Mais une fois que j'ai fait cela, je reçois ce qui suit:

Impossible de trouver une adresse de base qui correspond au schéma http pour le point de terminaison avec la liaison BasicHttpBinding. Les schémas d'adresses de base enregistrés sont [https].

Il semble qu'il ne sache pas quelle est l'adresse de base, mais comment la spécifier? Voici la section pertinente de mon fichier web.config:

<system.serviceModel>
  <serviceHostingEnvironment>
    <baseAddressPrefixFilters>
      <add prefix="http://mywebsiteurl"/>
    </baseAddressPrefixFilters>
  </serviceHostingEnvironment>

  <behaviors>
    <serviceBehaviors>
      <behavior name="WcfPortalBehavior">
        <serviceMetadata httpGetEnabled="true"/>
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <bindings>
    <basicHttpBinding>
      <binding name="BasicHttpBinding_IWcfPortal"
               maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
               receiveTimeout="00:10:00" sendTimeout="00:10:00"
               openTimeout="00:10:00" closeTimeout="00:10:00">
        <readerQuotas maxBytesPerRead="2147483647" maxArrayLength="2147483647"
               maxStringContentLength="2147483647"/>
      </binding>
    </basicHttpBinding>
  </bindings>

  <services>
    <service behaviorConfiguration="WcfPortalBehavior" name="Csla.Server.Hosts.Silverlight.WcfPortal">
      <endpoint address="" binding="basicHttpBinding" contract="Csla.Server.Hosts.Silverlight.IWcfPortal"
      bindingConfiguration="BasicHttpBinding_IWcfPortal">
      </endpoint>
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    </service>
  </services>
</system.serviceModel>

Quelqu'un peut-il nous éclairer sur ce qui se passe et comment y remédier?

34
Craig Shearer

Essayez de changer le mode de sécurité de "Transport" à "Aucun".

      <!-- Transport security mode requires IIS to have a
           certificate configured for SSL. See readme for
           more information on how to set this up. -->
      <security mode="None">
41
dale

Y a-t-il une chance que votre IIS est configuré pour exiger SSL sur les connexions à votre site/application?

4
tomasr

Si vous souhaitez utiliser baseAddressPrefixFilters dans web.config, vous devez également configurer IIS (6). Cela m'a aidé:

1/Dans IIS trouvez votre site. 2/Propriétés/Site Web (onglet)/Adresse IP -> bouton Avancé 3/Ajouter un nouvel en-tête d'hôte sur le même port que vous utiliserez sur le Web. config.

4
LiborBes

J'ai dû faire deux choses à la configuration IIS du site/de l'application. Mon problème était lié au fonctionnement de net.tcp dans un site Web IIS App:

Premier:

  1. Faites un clic droit sur le IIS nom de l'application.
  2. Gérer le site Web
  3. Réglages avancés
  4. Définissez les protocoles activés sur "http, net.tcp"

Seconde:

  1. Dans le menu Actions sur le côté droit du gestionnaire, cliquez sur Liaisons ...
  2. Cliquez sur Ajouter
  3. Changez le type en "net.tcp"
  4. Définissez les informations de liaison sur {numéro de port ouvert}: *
  5. D'accord
4
ZaChickster

Seule la première adresse de base de la liste sera prise en charge (provenant d'IIS). Vous ne pouvez pas avoir plusieurs adresses de base par schéma avant .NET4.

2
Ákos

La solution consiste à définir une liaison personnalisée à l'intérieur de votre fichier Web.Config et à définir le mode de sécurité sur "Transport". Il vous suffit ensuite d'utiliser la propriété bindingConfiguration dans votre définition de point de terminaison pour pointer vers votre liaison personnalisée.

Voir ici: Scott's Blog: WCF Bindings Needed For HTTPS

1
fiberOptics

S'il est hébergé dans IIS, il n'est pas nécessaire de spécifier une adresse de base, ce sera l'adresse du répertoire virtuel.

0
Philippe

Confirmé ma correction:

Dans votre fichier web.config, vous devez le configurer pour qu'il ressemble à ceci:

<system.serviceModel >
    <serviceHostingEnvironment configSource=".\Configurations\ServiceHosting.config" />
    ...

Ensuite, créez une structure de dossiers qui ressemble à ceci:

/web.config
/Configurations/ServiceHosting.config
/Configurations/Deploy/ServiceHosting.config

Le service de base hôte.config devrait ressembler à ceci:

<?xml version="1.0"?>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

tandis que celui dans/Deploy ressemble à ceci:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix="http://myappname.web707.discountasp.net"/>
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>

Au-delà de cela, vous devez ajouter une étape de déploiement manuelle ou automatisée pour copier le fichier depuis/Déployer sur celui dans/Configurations. Cela fonctionne incroyablement bien pour l'adresse de service et les chaînes de connexion, et économise des efforts pour effectuer d'autres solutions.

Si vous n'aimez pas cette approche (qui s'adapte bien aux batteries de serveurs, mais est plus faible sur une seule machine), vous pouvez envisager d'ajouter un fichier web.config à un niveau supérieur au déploiement de service sur la machine de l'hôte et d'y placer le nœud serviceHostingEnvironment. Cela devrait être en cascade pour vous.

0
Eric Willeke

Il devrait y avoir un moyen de résoudre ce problème assez facilement avec des sections de configuration externes et une étape de déploiement supplémentaire qui dépose un fichier .config externe spécifique au déploiement dans un emplacement connu. Nous utilisons généralement cette solution pour gérer les différentes configurations de serveur pour nos différents environnements de déploiement (Staging, QA, production, etc.), notre "boîte de développement" étant la valeur par défaut si aucune copie spéciale ne se produit.

0
Eric Willeke