Share via


Op WCF gebaseerde communicatiestack voor Reliable Services

Met het Reliable Services-framework kunnen serviceauteurs de communicatiestack kiezen die ze voor hun service willen gebruiken. Ze kunnen de communicatiestack van hun keuze aansluiten via de ICommunicationListener die is geretourneerd via de methoden CreateServiceReplicaListeners of CreateServiceInstanceListeners . Het framework biedt een implementatie van de communicatiestack op basis van wcf (Windows Communication Foundation) voor serviceauteurs die wcF-communicatie willen gebruiken.

WCF-communicatielistener

De WCF-specifieke implementatie van ICommunicationListener wordt geleverd door de klasse Microsoft.ServiceFabric.Services.Communication.Wcf.Runtime.WcfCommunicationListener .

Stel dat we een servicecontract van het type hebben ICalculator

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    Task<int> Add(int value1, int value2);
}

We kunnen een WCF-communicatielistener maken in de service op de volgende manier.


protected override IEnumerable<ServiceReplicaListener> CreateServiceReplicaListeners()
{
    return new[] { new ServiceReplicaListener((context) =>
        new WcfCommunicationListener<ICalculator>(
            wcfServiceObject:this,
            serviceContext:context,
            //
            // The name of the endpoint configured in the ServiceManifest under the Endpoints section
            // that identifies the endpoint that the WCF ServiceHost should listen on.
            //
            endpointResourceName: "WcfServiceEndpoint",

            //
            // Populate the binding information that you want the service to use.
            //
            listenerBinding: WcfUtility.CreateTcpListenerBinding()
        )
    )};
}

Clients schrijven voor de WCF-communicatiestack

Voor het schrijven van clients om te communiceren met services met behulp van WCF, biedt het framework WcfClientCommunicationFactory, de WCF-specifieke implementatie van ClientCommunicationFactoryBase.


public WcfCommunicationClientFactory(
    Binding clientBinding = null,
    IEnumerable<IExceptionHandler> exceptionHandlers = null,
    IServicePartitionResolver servicePartitionResolver = null,
    string traceId = null,
    object callback = null);

Het WCF-communicatiekanaal kan worden geopend vanuit de WcfCommunicationClient die is gemaakt door wcfCommunicationClientFactory.


public class WcfCommunicationClient : ServicePartitionClient<WcfCommunicationClient<ICalculator>>
   {
       public WcfCommunicationClient(ICommunicationClientFactory<WcfCommunicationClient<ICalculator>> communicationClientFactory, Uri serviceUri, ServicePartitionKey partitionKey = null, TargetReplicaSelector targetReplicaSelector = TargetReplicaSelector.Default, string listenerName = null, OperationRetrySettings retrySettings = null)
           : base(communicationClientFactory, serviceUri, partitionKey, targetReplicaSelector, listenerName, retrySettings)
       {
       }
   }

Clientcode kan wcfCommunicationClientFactory samen met de WcfCommunicationClient gebruiken waarmee ServicePartitionClient wordt geïmplementeerd om het service-eindpunt te bepalen en met de service te communiceren.

// Create binding
Binding binding = WcfUtility.CreateTcpClientBinding();
// Create a partition resolver
IServicePartitionResolver partitionResolver = ServicePartitionResolver.GetDefault();
// create a  WcfCommunicationClientFactory object.
var wcfClientFactory = new WcfCommunicationClientFactory<ICalculator>
    (clientBinding: binding, servicePartitionResolver: partitionResolver);

//
// Create a client for communicating with the ICalculator service that has been created with the
// Singleton partition scheme.
//
var calculatorServiceCommunicationClient =  new WcfCommunicationClient(
                wcfClientFactory,
                ServiceUri,
                ServicePartitionKey.Singleton);

//
// Call the service to perform the operation.
//
var result = calculatorServiceCommunicationClient.InvokeWithRetryAsync(
                client => client.Channel.Add(2, 3)).Result;

Notitie

Bij de standaardServicePartitionResolver wordt ervan uitgegaan dat de client wordt uitgevoerd in hetzelfde cluster als de service. Als dat niet het geval is, maakt u een ServicePartitionResolver-object en geeft u de eindpunten van de clusterverbinding door.

Volgende stappen