188 votes

Erreur de démarrage du service WCF "Cette collection contient déjà une adresse avec le schéma http".

J'ai construit une application web contenant un contrat de service WCF et un contrôle Silverlight qui fait des appels à ce service WCF. Sur mes serveurs de développement et de test, cela fonctionne parfaitement.

Lorsque je déploie sur notre serveur live et que j'exécute l'application, j'obtiens une exception de type System.ServiceModel.ServiceActivationException qui indique que le service ne peut pas être activé en raison d'une exception lors de la compilation. L'exception est :

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

J'ai lu que cette exception peut être levée si le site Web a plus d'un en-tête d'hôte, ce qui est vrai sur notre serveur en direct. Apparemment, les services WCF hébergés dans IIS ne peuvent avoir qu'une seule adresse de base. Comment puis-je contourner ce problème ?

175voto

ericvg Points 2270

En .Net 4, vous pouvez utiliser la fonction multipleSiteBindingsEnabled option :

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

Ainsi, vous n'aurez pas à spécifier chaque adresse.

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx

0 votes

Oui, mais cela ne fonctionne qu'avec .NET 4.0 et plus. Impossible de l'utiliser avec les sites .NET 2.0/3.0/3.5.

2 votes

Note - il y a une faute de frappe ici - il n'y a pas de fermeture >, donc si vous copiez et collez, vous aurez des problèmes.

2 votes

Cela ne fonctionnera pas pour cette question : "Cette fonctionnalité est uniquement disponible en utilisant le protocole HTTP."

148voto

Jeremy Points 14078

Résumé,

Solution de code : Ici

Solutions de configuration : Ici

Avec l'aide de Mike Chaliy J'ai trouvé des solutions pour y parvenir par le biais du code. Comme ce problème va affecter pratiquement tous les projets que nous déployons dans un environnement réel, j'ai cherché une solution purement de configuration. J'ai fini par en trouver une qui détaille comment le faire dans .net 3.0 et .net 3.5.

Extrait du site, voici un exemple de la façon de modifier la configuration web de vos applications :

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

Dans l'exemple ci-dessus, net.tcp://payroll.myorg.com:8000 et http://shipping.myorg.com:9000 sont les seules adresses de base, pour leurs régimes respectifs, qui seront autorisées à passer. Le filtre baseAddressPrefixFilter ne supporte pas les supporte pas les caractères génériques.

Les baseAddresses fournies par IIS peuvent avoir des adresses liées à d'autres schémas non présents dans la liste baseAddressPrefixFilter liste. Ces adresses ne seront pas filtrées.

Solution DNS (non testée) : Je pense que si vous créiez une nouvelle entrée dns spécifique à votre application web, que vous ajoutiez un nouveau site web et que vous lui donniez un en-tête d'hôte unique correspondant à l'entrée dns, vous atténueriez complètement ce problème et n'auriez pas à écrire de code personnalisé ou à ajouter des préfixes à votre fichier web.config.

2 votes

L'ajout du filtre préfixe de l'adresse de base au web.config a parfaitement fonctionné. Merci Jeremy !

2 votes

Je ne vois aucune raison pour laquelle on voudrait une telle restriction, et encore moins le paramètre par défaut...

42 votes

Je commence à penser du mal de WCF en combinaison avec ASP.net et des services web accédés par JavaScript. J'avais beaucoup moins de problèmes avec les vieux services ASMX...

66voto

Mike Chaliy Points 8694

Tu as vu ça - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

Vous pouvez résoudre cette erreur en modifiant le fichier web.config.

Avec ASP.NET 4.0, ajoutez les lignes suivantes à votre web.config :

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Avec ASP.NET 2.0/3.0/3.5, ajoutez les lignes suivantes à votre web.config :

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel>

0 votes

Merci. Je vais continuer à chercher pour voir s'il existe une solution non codée. Quelque chose qui peut être fait dans la configuration parce que cela va affecter tous les projets que nous faisons, j'espère ne pas avoir à écrire de code personnalisé.

19voto

Amar Points 31

Dans mon cas, la cause première de ce problème était de multiples liaisons http définies sur le site web parent, c'est-à-dire InetMgr->Sites->Mysite->properties->EditBindings. J'ai supprimé une liaison http qui n'était pas nécessaire et le problème a été résolu.

1 votes

Oui Amar, cela a été très utile - dans mon cas, c'était UNE AUTRE site web avec des fixations multiples qui l'ont cassé. Disponible en externe sur la même machine (mais avec un nom d'hôte différent). De la même manière, on pourrait régler ce problème en ajoutant le paramètre multipleSiteBindingsEnabled, mais le web.config serait alors différent de tous les autres environnements.

2 votes

C'est une honte que cela soit en bas de l'échelle. Dans notre cas, cela a réglé le problème.

0 votes

Cela m'a aidé à reproduire l'erreur dans l'environnement de développement. Je ne peux pas modifier les liaisons de sites Web, ni dans l'environnement de certification ni dans l'environnement réel. J'ai modifié mon fichier hosts pour simuler un domaine et ajouté des liens à l'IIS local et bam !

12voto

modosansreves Points 1678

Et dans mon cas, c'était simple : J'ai utilisé l'assistant "Add WCF Service" dans Visual Studio, qui a automatiquement créé les sections correspondantes dans app.config. Puis j'ai continué à lire Comment : Héberger un service WCF dans une application gérée . Le problème était que : Je n'avais pas besoin de spécifier l'url pour exécuter le service web.

Remplacer :

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

Avec :

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

Et l'erreur a disparu.

Idée générique : si vous fournissez l'adresse de base comme paramètre et le spécifier dans la configuration, vous obtenez cette erreur. Mais ce n'est probablement pas la seule façon d'obtenir cette erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X