Utilizzare un custom resolver per il p2p di WCF

di Cristian Civera, in Windows Communication Foundation,

Nello script #77 si è visto com'è facile con Windows Communication Foundation realizzare una chat che sfrutti il binding Peer to peer per far comunicare n client tra di loro in assenza di un server intermediario. L'unico requisito è avere un peer resolver in grado di dire ai peer i loro indirizzi, il cui compito, nello script precedente, era affidato al pnrp predefinito fornito da Microsoft.

E' possibile però impostare un resolver personalizzo che altro non è che un ulteriore servizio che implementa il contratto IPeerResolverContract del namespace System.ServiceModel.PeerResolvers, già contenuto in System.ServiceModel.dll. Quest'interfaccia definisce le operazioni necessarie per far sì che i peer si registrino e ottengano le informazioni necessarie per connettersi agli altri peer. Esiste inoltre già un servizio che implementa tale interfaccia, di nome CustomPeerResolverService che espone le funzionalità minime. Per sfruttarlo occorre preparare una seconda applicazione ed esporre il servizio secondo il binding e l'hosting che più si preferisce. In questo script si sfrutta una console application:

CustomPeerResolverService resolver = new CustomPeerResolverService();
resolver.RefreshInterval = TimeSpan.FromMinutes(1);
resolver.Open();

ServiceHost serviceHost = new ServiceHost(resolver);
serviceHost.Open();

Come è solito fare si configura il servizio nel config.

<configuration>
  <system.serviceModel>
    <services>
      <service name="System.ServiceModel.PeerResolvers.CustomPeerResolverService">
        <host>
          <baseAddresses>
            <add baseAddress="net.tcp://localhost/PeerResolverService" />
          </baseAddresses>
        </host>
        <endpoint address=""
          binding="netTcpBinding"
          bindingConfiguration="peerResolverBinding"
          contract="System.ServiceModel.PeerResolvers.IPeerResolverContract" />
      </service>
    </services>
    <bindings>
      <netTcpBinding>
        <binding name="peerResolverBinding">
          <security mode="None"/>
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

A questo punto i peer devono utilizzare il resolver custom, specificando gli indirizzi e il binding con l'eventuale relativa configurazione da utilizzare.

<system.serviceModel>
  <client>
    <endpoint name="ChatService"
      address="net.p2p://winfxitalia/Chat"
      binding="netPeerTcpBinding"
      bindingConfiguration="chatBinding"
      contract="PeerChat.IChat">
    </endpoint>
  </client>
  <bindings>
    <netPeerTcpBinding>
      <binding name="chatBinding" port="0">
        <security mode="None" />
          <resolver mode="Custom">
            <custom address="net.tcp://localhost/PeerResolverService"
              binding="netTcpBinding"/>
          </resolver>
      </binding>
    </netPeerTcpBinding>
  </bindings>
</system.serviceModel>

Il resolver svolge un ruolo fondamentale perciò è importante l'host che lo tiene in vita e il fatto che deve essere raggiungibile all'indirizzo specificato.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi