ciao

 

DEMO

 

se abbiamo l’esigenza di usare dei servizi con più di un server a disposizione, e non vogliamo conoscere a priori l’URI del server… possiamo usare una tecnologia standard sui servizi SOAP detta WS-Discovery

il client è minimale, cerco il server, lo trovo, creo un proxy, lo chiamo:

//cerco il server
DynamicEndpoint endpoint = new DynamicEndpoint(ContractDescription.GetContract(typeof(Services.IDateTimeService)),
                                    new WSHttpBinding(SecurityMode.None)); //stessa configurazione di sicurezza del server

//creo una factory per generare client
var channel = new ChannelFactory<Services.IDateTimeService>(endpoint);

//creo un client-proxy per chiamarlo
var risp = channel.CreateChannel();


//chiamo

Console.WriteLine(risp.GetServerTime());
Console.ReadLine();

 

il server è semplice, ma richiede un po di configurazione in più nel .config:

 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="meta">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDiscovery>
            <announcementEndpoints>
              <endpoint kind="udpAnnouncementEndpoint" />
            </announcementEndpoints>
          </serviceDiscovery>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="Server.DateTimeService" behaviorConfiguration="meta">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/discoverytest"/>
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" bindingConfiguration="unsecure" contract="Server.IDateTimeService"/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <endpoint kind="udpDiscoveryEndpoint" endpointConfiguration="adHoc" />
      </service>
    </services>

    <standardEndpoints>
      <udpDiscoveryEndpoint>
        <standardEndpoint name="adHoc" discoveryMode="Adhoc"/>
        <standardEndpoint name="proxy" discoveryMode="Managed"/>
      </udpDiscoveryEndpoint>
    </standardEndpoints>
    <bindings>
      <wsHttpBinding>
        <binding name="unsecure">
          <security mode="None" />
          <!-- rimetti a Message per riabilitare la sicurezza integrata windows se hai i pc in dominio o i nomiutente collimano-->
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

DEMO

 

a presto