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.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 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?
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>
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.
la source
Avez-vous vu cela - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx
<system.serviceModel> <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> </system.serviceModel>
<system.serviceModel> <serviceHostingEnvironment> <baseAddressPrefixFilters> <add prefix="http://www.YourHostedDomainName.com"/> </baseAddressPrefixFilters> </serviceHostingEnvironment> </system.serviceModel>
la source
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.
la source
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.
la source
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é.
la source
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.
la source