Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

WCF – “Ajax-enabled WCF Service” ne peut pas avoir plusieurs bindings - “Cette collection contient déjà une adresse avec le schéma http.”

Afin de communiquer avec le serveur depuis le client en JavaScript, il est possible d’utiliser un “Ajax-enabled WCF Service”. Il s’agit d’un service WCF classique qui possède un binding et un behavior personnalisé afin de générer du JSON.

Si votre site web possède plusieurs binding il se peut que vous soyez face à ce problème.

This collection already contains an address with scheme http. There can be at most one address per scheme in this collection.

ou en français

Cette collection contient déjà une adresse avec le schéma http. Une adresse tout au plus par schéma est possible dans cette collection.

Mais tout d’abord, quand est-ce que notre site web utilisera plusieurs bindings ? C’est le cas lorsque vous configurez un seul site web au niveau de IIS pour plusieurs urls. Par exemple si vous avez un site web accessible via

image

Ce problème est assez bien connu sur le net, il existe 2 bidouilles.

La première est de rajouter l’url dans le fichier de configuration :

<serviceHostingEnvironment> <baseAddressPrefixFilters> <add prefix="http://www.mydomain.com"/> </baseAddressPrefixFilters> </serviceHostingEnvironment>

La seconde est de créer un ServiceHostFactory personnalisé

public class CustomHostFactory : ServiceHostFactory { protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { return base.CreateServiceHost(serviceType, new Uri[]{ baseAddresses[0]}); } }

<%@ ServiceHost Language="C#" Debug="true" Service="DataService" CodeBehind="~/App_Code/DataService.cs" Factory="CustomHostFactory" %>

Malheureusement ces 2 bidouilles permettent de faire fonctionner le service seulement pour un domaine. Cela pose des soucis car à partir d’un appel AJAX il n’est pas possible de faire des requêtes crossdomain.

Afin de remonter le problème à Microsoft, j’ai recherché le bug sur connect : Feedback : Can't host WCF service in a website with multiple identities. Celui-ci est en état “Closed (By design)” ! Microsoft ne nous indique aucune piste afin de résoudre ce souci.

Ne me satisfaisant pas de cette solution, j’ai testé d’autres bidouilles. J’ai réussit à faire fonctionner le service avec plusieurs bindings en créant un ServiceHostFactory personalisé qui consiste à créer manuellement les ServiceEndpoint.

// use this class with caution ! // it's a workaround for this bug // https://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=322896 public class CustomHostFactory : ServiceHostFactory { protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) { // a valid url is required ServiceHost host = new ServiceHost(serviceType, new Uri[] { baseAddresses[0] }); // manually create endpoint for each uri - ignore WCF config file for (int i = 0; i < baseAddresses.Length; i++) { WebHttpBinding webHttpBinding = new WebHttpBinding(); ServiceEndpoint endpoint = host.AddServiceEndpoint(serviceType, webHttpBinding, baseAddressesIdea); endpoint.Behaviors.Add(new WebScriptEnablingBehavior()); } return host; } }

Cette solution n’est pas idéale puisqu’elle ne prend pas en compte la configuration WCF stocké dans le fichier de configuration, cependant cela me permet de faire fonctionner mon service WCF sur 2 URLs distinct.

Si vous avez d’autres astuces ou informations à ce problème, je suis preneur.

N’oublier pas de voter pour ce bug si vous rencontrez ce soucis : Feedback : Can't host WCF service in a website with multiple identities

Posted: dimanche 19 avril 2009 20:22 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Office 365: Nettoyage des versions de List Item avant migration depuis SharePoint On Premise vers SharePoint Online par Blog Technique de Romelard Fabrice le 08-08-2017, 15:36

- Office 365: Comment supprimer des éléments de liste SharePoint Online via PowerShell par Blog Technique de Romelard Fabrice le 07-26-2017, 17:09

- Nouveau blog http://bugshunter.net par Blog de Jérémy Jeanson le 07-01-2017, 16:56

- Office 365: Script PowerShell pour assigner des droits Full Control à un groupe défini par Blog Technique de Romelard Fabrice le 04-30-2017, 09:22

- SharePoint 20XX: Script PowerShell pour exporter en CSV toutes les listes d’une ferme pour auditer le contenu avant migration par Blog Technique de Romelard Fabrice le 03-28-2017, 17:53

- Les pièges de l’installation de Visual Studio 2017 par Blog de Jérémy Jeanson le 03-24-2017, 13:05

- UWP or not UWP sur Visual Studio 2015 ? par Blog de Jérémy Jeanson le 03-08-2017, 19:12

- Désinstallation de .net Core RC1 Update 1 ou SDK de Core 1 Preview 2 par Blog de Jérémy Jeanson le 03-07-2017, 19:29

- Office 365: Ajouter un utilisateur ou groupe dans la liste des Site collection Administrator d’un site SharePoint Online via PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-24-2017, 18:52

- Office 365: Comment créer une document library qui utilise les ContentTypeHub avec PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-22-2017, 17:06