WCF WPF ObjectDataProvider MaxConcurrentSessions
Je viens de m'arracher la tête sur un vil bug impliquant WCF et WPF via l'ObjectDataProvider
Au bout de 10 appels de mon service (via le proxy généré avec un Add Service Reference) j'atteins le MaxConcurrentSessions, fixé de base à 10.
Le code serveur n'ayant rien d'extraordinaire, je passe directement à mon code client, dans mon formulaire WCF
ObjectDataProvider odpServiceType;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//Set source for service type
odpServiceType = new ObjectDataProvider();
// Make it Asynchronous
odpServiceType.IsAsynchronous = true;
odpServiceType.ObjectType = typeof(MyServiceProxy.MyServiceClient);
odpServiceType.MethodName = "GetServiceTypes";
// Set DataContext
this.comboBox1.DataContext = odpServiceType;
}
J'utilise mon ObjectDataProvider en lui précisant le type d'objet et la méthode à appeller.
Je lance l'application 10 fois, la 11eme se vautre lamentablement.
Hop un coup de Service Trace Viewer me donne vite l'indication que je cherche :
MaxConcurrentSessions atteint !!!
Et oui, l'objectdataprovider n'appelle pas explicitement le close de mon channel !
Résolution facile, enfin une fois qu'on a compris :)
Sur le Close de ma Window, nous castons l'instance crée par l'objectdataprovider en MyServiceClient, et nous appellons explicitement la méthode close:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
MyServiceProxy.MyServiceClient service = odpServiceType.ObjectInstance
as MyServiceProxy.MyServiceClient;
if (service != null && service.State != CommunicationState.Closed)
service.Close();
base.OnClosing(e);
}
Bon WCF-WPF à tous 