Mim

Select * from Seb where Sujets in (SQL Server 2008, ADO.NET, Visual Studio 2008)

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 :

 

image

 

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 Winking