none
WCF InstanceContextMode.PerSession RRS feed

  • Question

  • Bonjour,

    voilà ma question, j'ai un service WCF avec : InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple

    Dans mes méthodes, j'ai une classe "Context" qui contient l'utilisateur actuel, le logger... Donc j'instancie cette classe à chaque "appelle" de mon WCF : 

    public class WcfInstanceContext : IExtension<OperationContext>
        {
            private readonly IDictionary<string, object> items;
    
            private WcfInstanceContext()
            {
                items = new Dictionary<string, object>();
            }
    
            public IDictionary<string, object> Items
            {
                get { return items; }
            }
    
            public static WcfInstanceContext Current
            {
                get
                {
                    WcfInstanceContext context = OperationContext.Current.Extensions.Find<WcfInstanceContext>();
                    if (context == null)
                    {
                        context = new WcfInstanceContext();
                        OperationContext.Current.Extensions.Add(context);
                    }
                    return context;
                }
            }
    
            public void Attach(OperationContext owner) { }
            public void Detach(OperationContext owner) { }
        }

    Après j'utilise par exemple : WcfInstanceContext.Current.Items["CurrentUser"] pour récupérer l'utilisateur.

    Là ca marche très bien, s'il y a 5 utilisateurs en même temps, chaque "session" a bien son "CurrentUser".

    Maintenant dans mon service, j'ai un traitement et j'essaie de le fait avec Parallel.ForEach : 

    Parallel.Foreach(list, l => 
    {
        User currentUser = WcfInstanceContext.Current.Items["CurrentUser"];
    
    // ... autres traitements dans d'autres fonctions qui récupèrent aussi l'utilisateur actuel...
    
    });

    Sauf que là mon "WcfInstanceContext.Current" est null...

    Donc j'aimerai une espèce de "classe static" instancié à chaque nouvel appel (nouvelle session) de mon WebService mais que dans la session, elle soit accessible partout y compris dans les différents threads...

    Que dois je faire ?

    Merci

    mardi 6 novembre 2012 15:17