J'ai créé un service Windows Communication Foundation (AppDomain dans ce cas est une application Windows Forms) qui initialise sa classe serviceType comme singleton:WCF serviceType comme une instance singleton
Démarrage des travaux de service. Faire un appel d'un client fonctionne. Mais si le service fait un appel à lui-même avec le code ci-dessus ("// Faire le 1er appel au service?"), J'obtiens une exception System.TimeoutException.
private static myDataService.DataProvider.CustomSingletonClass obs;
public DataProviderServiceType()
{
//Create the object if needed. This should only be required first time.
if (obs == null)
{
obs = new myDataService.DataProvider.CustomSingletonClass();
//Instruct the class to read its configuration and initialize.
obs.initializeSingletonClass(null);
}
}
La classe singleton a un objet timer qui commencera à son initialisation. Ainsi, une fois qu'un client a fait un appel au service, la classe est instanciée, le temporisateur est démarré et l'objet continue son existence avec son objet temporisateur qui se déclenche périodiquement.
Pour le contexte, l'événement du temporisateur mettra à jour les propriétés du singleton. Le but est que la classe singleton exécute périodiquement des calculs, conserve les données dans ses propriétés et renvoie tout ce qu'il y a dans les propriétés à l'appel du client. De cette façon, les appels pour effectuer des calculs périodiques (basés sur le temps) sont limités et tous les clients reçoivent les mêmes données mises à jour. Le problème est qu'une fois le service hébergé, il suffit qu'un seul client lance un appel pour que l'instance singleton soit créée et que le minuteur soit démarré.
SetListText("Starting Service...");
host_DataService = new ServiceHost(serviceType_Data);
host_DataService.Open();
SetListText("Service is now available.");
Je voudrais le service pour initialiser la classe singleton avec un appel afin que le 1er client de faire une demande ne doit pas attendre la configuration et l'initialisation doit avoir lieu; les données à actualiser lors du démarrage du programme. Juste après "SetListText (" Le service est maintenant disponible. ");" j'ai les suivantes:
//Make the 1st call to the service?
EndpointAddress endpointAddress = new EndpointAddress("http://localhost:8000/myDataService/DataProvider/TimedCalculator");
BasicHttpBinding serviceBinding = new BasicHttpBinding();
serviceBinding.CloseTimeout = new TimeSpan(0, 1, 0);
serviceBinding.OpenTimeout = new TimeSpan(0, 1, 0);
serviceBinding.ReceiveTimeout = new TimeSpan(0, 10, 0);
serviceBinding.SendTimeout = new TimeSpan(0, 1, 0);
DataProviderClient client = new DataProviderClient (serviceBinding, endpointAddress);
String[][] ArrStr = client.retrieveList();
Est-il possible d'avoir un service de WCF faire un appel à lui-même dans le même appdomain ou est raisonnablement ce indésirable? Y a-t-il des raisons d'abandonner ce code d'auto-appel et de vivre avec l'appel de service du 1er client?