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

182

J'ai créé une application Web contenant un contrat de service WCF et un contrôle Silverlight qui appelle ce service WCF. Sur mes serveurs de développement et de test, cela fonctionne très bien.

Lorsque je déploie sur notre serveur en direct et exécute l'application, j'obtiens une exception de type System.ServiceModel.ServiceActivationExceptionqui 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 plus 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 contourner ce problème?

Jérémie
la source

Réponses:

168

Dans .Net 4, vous pouvez utiliser l' multipleSiteBindingsEnabledoption:

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

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

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

ericvg
la source
Oui, mais cela ne fonctionne qu'avec .NET 4.0 et supérieur. Impossible de l'utiliser avec les sites .NET 2.0 / 3.0 / 3.5.
Bytemaster
2
Remarque - 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
sydneyos
2
Cela ne fonctionnera pas pour cette question: "Cette fonctionnalité n'est disponible qu'en utilisant le protocole HTTP."
George Tsiokos
146

Sommaire,

Solution de code: ici

Solutions de configuration: ici

Avec l'aide de Mike Chaliy , j'ai trouvé des solutions sur la façon de procéder par code. Parce que ce problème va affecter à peu près tous les projets que nous déployons dans un environnement réel, j'ai proposé une solution purement de configuration. J'ai finalement trouvé un qui détaille comment le faire dans .net 3.0 et .net 3.5.

Tiré du site, ci-dessous est 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 schémas respectifs, qui pourront être transmises. Le baseAddressPrefixFilter ne prend en charge aucun caractère générique.

Les basesAddresses fournies par IIS peuvent avoir des adresses liées à d'autres schémas non présents dans la liste baseAddressPrefixFilter. 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, ajoutiez un nouveau site Web et lui donniez un en-tête d'hôte unique correspondant à l'entrée DNS, vous atténueriez complètement ce problème, et ne le feriez pas devez écrire un code personnalisé ou ajouter des préfixes à votre fichier web.config.

Jérémie
la source
2
L'ajout du filtre de préfixe d'adresse de base au web.config a parfaitement fonctionné. Merci Jeremy!
Mike737
2
Je ne vois aucune raison pour laquelle on voudrait une telle restriction, encore moins le paramètre par défaut ...
pbz
42
Je commence à mal penser à WCF en combinaison avec ASP.net et les services Web accessibles via JavaScript. J'ai eu beaucoup moins de problèmes avec les anciens services ASMX ...
Juri
Ok et si vous avez un site avec un mélange d'applications .net 4 et .net 2 fonctionnant sous lui. La base de l'application est .net4 et il y a plusieurs applications en dessous qui nécessitent .net2. Utilisez-vous <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> dans tous les fichiers .net4 et le préfixe dans les applications .net 2?
Travis
59

Avez-vous vu cela - 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> 
Mike Chaliy
la source
Merci. Je vais continuer à chercher pour voir s'il existe une solution non codée. Quelque chose qui peut être fait dans la configuration, car cela affectera tous les projets que nous faisons J'espère ne pas avoir à écrire de code personnalisé.
Jeremy
16

Dans mon cas, la cause principale de ce problème était plusieurs 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 requise et le problème a été résolu.

Amar
la source
1
Oui Amar, cela a été très utile - dans mon cas, c'était UN AUTRE site Web avec plusieurs liaisons qui l'a cassé. Disponible en externe sur la même machine (mais avec un nom d'hôte différent). De même, cela pourrait être corrigé en ajoutant le paramètre multipleSiteBindingsEnabled, mais le web.config serait alors différent de tous les autres environnements.
The Coder
2
C'est dommage que ce soit au fond. Dans notre cas, cela l'a corrigé pour nous.
brendonparker
Cela m'a aidé à reproduire l'erreur dans l'environnement de développement. Je ne peux pas modifier les liaisons de sites Web dans les environnements de certification ou en direct. J'ai changé mon fichier d'hôtes pour simuler un domaine et ajouté des liaisons aux IIS et bam locaux!
MFedatto
9

Et dans mon cas, c'était simple: j'ai utilisé l'assistant `` Ajouter un service WCF '' dans Visual Studio, qui a automatiquement créé les sections correspondantes dans app.config. Ensuite, j'ai lu Comment: héberger un service WCF dans une application gérée . Le problème était le suivant: 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 une adresse de base en tant que paramètre et que vous la spécifiez dans la configuration, vous obtenez cette erreur. Très probablement, ce n'est pas la seule façon d'obtenir l'erreur, toi.

bohdan_trotsenko
la source
J'ai résolu mon problème.
QShengyao
2

J'ai eu ce problème, et la cause était plutôt idiote. J'essayais la démo de Microsoft concernant l'exécution d'un ServiceHost à partir d'un exécutable en ligne de commande. J'ai suivi les instructions, y compris là où il est dit d'ajouter le service approprié (et l'interface). Mais j'ai eu l'erreur ci-dessus.

Il s'avère que lorsque j'ai ajouté la classe de service, VS a automatiquement ajouté la configuration à app.config. Et la démo essayait également d'ajouter ces informations. Comme il était déjà dans la configuration, j'ai supprimé la partie démo, et cela a fonctionné.

Eric
la source
0

Je suis venu par la même erreur sur un ancien serveur Exchange 2010. Un service (service de réplication de boîte aux lettres Exchange) donnait l'erreur ci-dessus et le processus de migration n'a pas pu se poursuivre. En cherchant sur Internet, je suis tombé sur ce lien qui indiquait ce qui suit:

Le GRE Exchange ne s'ouvre pas lorsqu'il est installé pour la première fois ou si des modifications sont apportées au serveur IIS. Il échoue avec une erreur de composant logiciel enfichable et lorsque vous essayez d'ouvrir la page du composant logiciel enfichable, le contenu suivant s'affiche:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

Cause : cette erreur se produit car le numéro de port http 443 est déjà utilisé par une autre application et le serveur IIS n'est pas configuré pour gérer plusieurs liaisons vers le même port.

Solution : configurez le serveur IIS pour gérer plusieurs liaisons de port. Contactez le fournisseur (Microsoft) pour le configurer.

Étant donné que ces services étaient proposés à partir d'un serveur Web IIS, la vérification des liaisons sur le site racine a résolu le problème. Quelqu'un avait gâché les liaisons de site, définissant des règles qui se chevauchaient et perturbaient les services.

La correction des liaisons correctes a résolu le problème, dans mon cas, et je n'ai pas eu à configurer Web.Config.

jimas13
la source