2011-05-23 7 views
10

J'ai un service WCF de découverte activé et maintenant je veux le connecter au client. Problème: Lorsque j'utilise le point de terminaison udp (1.) et que j'essaie de découvrir le service par programmation, cela fonctionne ... Lorsque j'utilise l'approche App.config (2.), ce n'est pas le cas (Erreur: Aucun point de terminaison découvert).WCF Discovery .NET 4: Problème avec la configuration config/programatically

Pour moi, il semble que le « résultat de découverte udp » des deux solutions devrait être la même, mais malheureusement ce n'est pas ...

1. approche Programmatically (travaux):

code:

 DiscoveryClient discClient = new DiscoveryClient("udpDiscoveryEndpoint"); 
     FindCriteria fCriteria = new FindCriteria(typeof(IAlarmServer)); 
     fCriteria.Duration = TimeSpan.FromSeconds(5); 
     fCriteria.MaxResults = 1; 
     FindResponse fResponse = discClient.Find(fCriteria); 

     EndpointAddress address = fResponse.Endpoints[0].Address; 
     Console.WriteLine("Address found: " + address.ToString()); 

Config:

<system.serviceModel> 
    <client> 
    <endpoint name="udpDiscoveryEndpoint" kind="udpDiscoveryEndpoint" /> 
    </client> 
</system.serviceModel> 

2. Approche avec App.config et "intégrée dans endpoint" approche (ne fonctionne pas!):

code:

 var Proxy = new AlarmServerClient("IAlarmServer"); // Default client generated by Visual Studio 
     Proxy.SomeMethod(); // throw no endpoints discovered exception 

Config:

<standardEndpoints> 
    <dynamicEndpoint> 
    <standardEndpoint name="discoveryDynamicEndpointConfiguration"> 
     <discoveryClientSettings> 
     <findCriteria duration="00:00:05" maxResults="1"> 
      <types> 
      <add name="AlarmServiceRef.IAlarmServer"/> 
      </types> 
     </findCriteria> 
     <endpoint kind="udpDiscoveryEndpoint"/> 
     </discoveryClientSettings> 
    </standardEndpoint> 
    </dynamicEndpoint> 
</standardEndpoints> 

Config:

<client> 
    <endpoint binding="basicHttpBinding" bindingConfiguration="DefaultBasicHttpBinding" contract="AlarmServiceRef.IAlarmServer" name="IAlarmServer" 
      kind="dynamicEndpoint" 
      endpointConfiguration="discoveryDynamicEndpointConfiguration"/> 
    </client> 

Des idées pour lesquelles cela se passe? Vous ne pouvez pas simplement ajouter une référence de service à votre projet client?

+0

personne? = (((((( – David

+0

Ce type est-il fort nommé? x0n

Répondre

0

Il va générer la configuration pour vous.

+0

Non, car il générera la référence avec une adresse IP/adresse fixe – David

+0

Oui, mais vous pouvez le remplacer lors de l'instanciation votre proxy –

+0

Bien sûr, mais je n'ai toujours pas de config valide pour ma découverte udp qui était ma question en premier lieu;) – David

2

Couple de choses lorsque vous organisez un service avec la découverte via IIS

  1. Dans la configuration du service assurez-vous que le nom du service correspond au nom de classe y compris l'espace de noms
  2. Vous devez vous assurer que la le service est en cours d'exécution avant que vous puissiez découvrir avec un client. Vous pouvez parcourir manuellement le fichier .svc du service ou héberger le service avec AppFabric et définir AutoStart sur true (Vous pouvez également indiquer dans le fichier web.config)
  3. Dans la configuration de service, vous devez émettre le type Renvoi à utiliser dans les critères de recherche sur le client

Voici un exemple de la configuration du serveur définissant les points de terminaison de service. Notez que l'attribut "nom" du service correspond à l'espace de noms complet de la classe qui met en œuvre le service.

Config Service

<services> 
     <service name="WcfDiscovery.Services.BuzzerService" behaviorConfiguration="sb1" > 
     <endpoint binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" address="" behaviorConfiguration="eb1" /> 
     <endpoint kind="udpDiscoveryEndpoint" /> 
     </service> 
    </services> 

assurez-vous d'ajouter également le comportement de découverte au service

Config Service

<serviceBehaviors> 
     <behavior name="sb1"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      <serviceDiscovery /> 
     </behavior> 
     </serviceBehaviors> 

Comme je veux que les clients puissent découvrir le service par la type (WcfDiscovery.Contracts.IAlarmServer) Je dois également spécifier que dans la configuration de comportement pour le point de terminaison (eb1)

Config Service

<endpointBehaviors> 
     <behavior name="eb1"> 
      <endpointDiscovery enabled="true"> 
      <types> 
       <add name="WcfDiscovery.Contracts.IAlarmServer" /> 
      </types> 
      </endpointDiscovery> 
     </behavior> 
     </endpointBehaviors> 

maintenant du côté client, je peux découvrir le service à l'aide du findCriteria. Notez que le type dans les critères de recherche doit correspondre à celui émis par le service (dans la liste des types de services)

client Config

<standardEndpoints> 
     <dynamicEndpoint> 
     <standardEndpoint name="dynamicEndpointConfiguration"> 
      <discoveryClientSettings > 
      <endpoint kind="udpDiscoveryEndpoint" /> 

      <findCriteria maxResults="2"> 
       <types> 
       <add name="WcfDiscovery.Contracts.IAlarmServer" /> 
       </types> 
      </findCriteria> 

      </discoveryClientSettings> 
     </standardEndpoint> 
     </dynamicEndpoint> 
    </standardEndpoints> 

Voici la configuration du point de terminaison client

client Config

<client> 
     <endpoint kind="dynamicEndpoint" name="endpoint" binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" endpointConfiguration="dynamicEndpointConfiguration" /> 
    </client> 

Enfin, je peux découvrir le service dans une application de la console comme ceci:

ChannelFactory<IAlarmServer> factory = new ChannelFactory<IAlarmServer>("endpoint"); 
      var proxy = factory.CreateChannel(); 

      Console.WriteLine(proxy.SoundAlarm()); 

Espérons que cela aide!