Reliable Services için WCF tabanlı iletişim yığını
Reliable Services çerçevesi, hizmet yazarlarının hizmetleri için kullanmak istedikleri iletişim yığınını seçmesine olanak tanır. CreateServiceReplicaListeners veya CreateServiceInstanceListeners yöntemlerinden döndürülen ICommunicationListener aracılığıyla istedikleri iletişim yığınını takabilir. Çerçeve, WCF tabanlı iletişimi kullanmak isteyen hizmet yazarları için Windows Communication Foundation'ı (WCF) temel alan bir iletişim yığını uygulaması sağlar.
WCF İletişim Dinleyicisi
ICommunicationListener'ın WCF'ye özgü uygulaması Microsoft.ServiceFabric.Services.Communication.Wcf.Runtime.WcfCommunicationListener sınıfı tarafından sağlanır.
Hizmet sözleşmemiz olduğunu varsayalım ICalculator
[ServiceContract]
public interface ICalculator
{
[OperationContract]
Task<int> Add(int value1, int value2);
}
Hizmette aşağıdaki şekilde bir WCF iletişim dinleyicisi oluşturabiliriz.
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()
)
)};
}
WCF iletişim yığını için istemci yazma
İstemcilerin WCF kullanarak hizmetlerle iletişim kurmasını yazmak için, çerçeve ClientCommunicationFactoryBase'in WCF'ye özgü uygulaması olan WcfClientCommunicationFactory'yi sağlar.
public WcfCommunicationClientFactory(
Binding clientBinding = null,
IEnumerable<IExceptionHandler> exceptionHandlers = null,
IServicePartitionResolver servicePartitionResolver = null,
string traceId = null,
object callback = null);
WCF iletişim kanalına WcfCommunicationClientFactory tarafından oluşturulan WcfCommunicationClient'dan erişilebilir.
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)
{
}
}
İstemci kodu, hizmet uç noktasını belirlemek ve hizmetle iletişim kurmak için ServicePartitionClient uygulayan WcfCommunicationClient ile birlikte WcfCommunicationClientFactory kullanabilir.
// 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;
Not
Varsayılan ServicePartitionResolver, istemcinin hizmetle aynı kümede çalıştığını varsayar. Bu durumda, bir ServicePartitionResolver nesnesi oluşturun ve küme bağlantı uç noktalarını geçirin.