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

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 live et exécute l’application, je reçois 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 puis-je contourner ce problème?

Dans .Net 4, vous pouvez utiliser l’option multipleSiteBindingsEnabled :

     

Ensuite, vous ne devrez pas spécifier chaque adresse.

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

Résumé,

Solution de code: ici

Solutions de configuration: ici

Avec l’aide de Mike Chaliy , j’ai trouvé des solutions sur la façon de le faire grâce au code. Étant donné que ce problème affectera à peu près tous les projets que nous déployons dans un environnement en direct, j’ai eu une solution purement de configuration. J’ai finalement trouvé un fichier qui détaille comment le faire dans .net 3.0 et .net 3.5.

Tiré du site, voici un exemple de la façon de modifier votre configuration Web d’applications:

         

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 systèmes respectifs, qui pourront être transmises. BaseAddressPrefixFilter ne prend en charge aucun caractère générique.

Les adresses baseAddresses 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, 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. avoir à écrire du code personnalisé ou append des préfixes à votre fichier web.config.

Avez-vous vu ceci – 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 fichier web.config:

    

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

        

Dans mon cas, la cause principale de ce problème était que plusieurs liaisons HTTP étaient définies sur le site Web parent, par exemple InetMgr-> Sites-> Mysite-> properties-> EditBindings. J’ai supprimé une liaison HTTP qui n’était pas requirejse et le problème a été résolu.

Et dans mon cas, c’était simple: j’ai utilisé l’assistant “Ajouter un service WCF” dans Visual Studio, qui créait automatiquement les sections correspondantes dans app.config. Ensuite, 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 est partie.

Idée générique: si vous fournissez l’adresse de base en tant que paramètre et que vous la spécifiez dans config, vous obtenez cette erreur. Très probablement, ce n’est pas la seule façon d’obtenir l’erreur, tu.

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

Lorsque j’ajoute la classe de service, il s’avère que VS a automatiquement ajouté la configuration à app.config. Et la démo essayait d’append cette information aussi. Comme il était déjà dans la configuration, j’ai supprimé la partie démo et cela a fonctionné.