2009-09-09 5 views
0

J'ai deux sites Web sur la même machine. Le premier (client) référence un service WCF sur le second site (serveur). Comment définir l'adresse de la référence de service?Points de terminaison WCF, baseAddressPrefixFilters, en-têtes d'hôte

Comment définir l'adresse de la référence de service? Lorsque je passe du développement sur ma machine locale au serveur de développement de groupe, comment puis-je changer l'URL du service? Les sites sont différenciés par têtes d'hôte, comme http://dev.admin/ ... et http://dev.public/ ...

Je sens que cela peut être traité en utilisant plusieurs points de terminaison, mais je suis très nouveau pour WCF et vraiment ne pas une idée de ce que je fais ici.

Répondre

1

Après beaucoup de frustration, je réussi à déterminer que les deux fichiers web.config (sur le client et le serveur, qui sont tous deux des applications web dans ce cas), les sections suivantes doivent être modifiées:

client :

<client> 
     <endpoint 
     address="http://mysite.com:port/services/someservice.svc" 
     binding="basicHttpBinding" 
     bindingConfiguration="BasicHttpBinding_ISomeService" 
     contract="MyServices.ISomeService" 
     name="BasicHttpBinding_ISomeService" /> 

    </client> 
    </system.serviceModel> 

serveur

<system.serviceModel> 
    <serviceHostingEnvironment> 
     <baseAddressPrefixFilters> 
     <add prefix="http://mysite.com:port/services"/> 
     </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServices.SomeServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="MyServices.SomeServiceBehavior" 
     name="MyServices.SomeService"> 
      <endpoint address="http://mysite.com:port/services/someservice.svc" 
        name="endpoint.SomeService" 
        binding="basicHttpBinding" 
        bindingConfiguration="" 
        contract="MyServices.ISomeService"/> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    </system.serviceModel> 

Le Il est important de noter ici que l'adresse de l'hôte dans les trois sections pertinentes (adresse du point de terminaison client, valeur de base du serveurAddressPrefixFilter et adresse du point de terminaison du serveur) doit correspondre.

Je peux passer d'un serveur à l'autre en les modifiant, à condition qu'ils correspondent. Je préférerais toujours un moyen de définir cela en fonction de la machine sur laquelle le serveur fonctionne, mais cela fonctionne pour le moment.

Impressions WCF Ce qui est chaud: objet persistant. L'objet proxy client (créé lorsque vous ajoutez une référence de service) maintient une connexion permanente au service sur le serveur. L'instance de service référencée par le proxy client conserve son état entre les appels, ce qui peut simplifier les signatures de méthode et rendre l'objet proxy client, et le service dans son ensemble, beaucoup plus utile pour certaines applications. Les types d'objets de paramètres peuvent être partagés entre le client et le serveur s'ils sont déclarés dans une bibliothèque commune, ce qui signifie que vous n'avez pas besoin de créer deux classes ou classes wrapper très similaires pour transmettre des structures de données non-primitives. Ce qui ne l'est pas: la configuration est une douleur royale, mal documentée et beaucoup trop compliquée. Faire fonctionner ceci dans une configuration d'environnement test/dev/staging/production où le service doit être conscient de son emplacement est frustrant. Je ne suis pas convaincu que le fait de rendre le service conscient de son URL de domaine (plutôt que, disons, un chemin relatif à tout ce qui est en cours d'exécution) présente des avantages significatifs, sans parler des problèmes de sécurité. Cela dit, je continue à suivre le chemin de la WCF, car les avantages l'emportent largement sur les maux de tête.

0

Le moyen le plus simple: exécuter les pièces WCF sur différents ports.

+0

Attention à élaborer? Je ne suis pas sûr de ce que vous entendez par "parties WCF". Aussi, est-il possible de spécifier un port pour le wcf différent du site auquel il appartient? Pourquoi voudrais-je faire ça? –

+0

Désolé, je suis plus habitué à héberger WCF dans les services, pas à l'intérieur d'IIS. Pour vos circonstances, vous pouvez regarder http://ferventcoder.com/archive/2007/10/02/WCF-in-IIS-with-Websites-that-have-Multiple-Identities.aspx –