Question

J'ai deux sites Web sur le même ordinateur. Le premier (client) fait référence à un service WCF sur le deuxième site (serveur).

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 du groupe, comment puis-je modifier l'URL du service? Les sites sont différenciés par des en-têtes d’hôte, comme http: //dev.admin/ ... et http: //dev.public/ ...

Je sens que cela peut être géré à l'aide de plusieurs terminaux, mais je suis très novice dans la WCF et je ne sais vraiment pas ce que je fais ici.

Était-ce utile?

La solution

Après beaucoup de frustration, j'ai réussi à déterminer que les deux fichiers web.config (sur le client et sur 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>

Ce qu'il faut noter ici, c'est que l'adresse de l'hôte dans les trois sections pertinentes (adresse du noeud final du client, valeur baseAddressPrefixFilter du serveur et adresse du noeud final du serveur) doit correspondre.

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

Impressions WCF Quoi de neuf: objet persistant. L'objet proxy client (créé lorsque vous ajoutez une référence de service) maintient une connexion persistante 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, ainsi que le service dans son ensemble, beaucoup plus utiles pour certaines applications. Les types d'objet de paramètre 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 à créer deux classes très similaires ou des classes wrapper pour transmettre des structures de données non primitives. p>

Ce qui n’est pas le cas: la configuration est une douleur royale, mal documentée et beaucoup trop complexe. Faire en sorte que cela fonctionne dans une configuration d'environnement de test / dev / staging / production où le service doit être conscient de son emplacement est frustrant. Je ne suis pas convaincu que faire en sorte que le service connaisse son URL de domaine (plutôt que, par exemple, un chemin d'accès relatif à celui-ci) présente un avantage significatif, à part les problèmes de sécurité.

Cela dit, je continue de suivre la voie de la WCF car les avantages l'emportent de loin sur les maux de tête.

Autres conseils

Manière la plus simple: exécutez les parties WCF sur différents ports.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top