Question

Je construis une série de services WCF qui seront utilisés par plusieurs applications. À cause de cela, j'essaie de définir une bibliothèque commune pour accéder aux services WCF.

Sachant que chaque demande de service faite par différents utilisateurs doit utiliser un canal différent, je pense que, dans le cache, le canal par demande ( HttpContext.Current.Items ) et met en cache le ChannelFactory utilisé pour créer le canal par application ( HttpApplication.Items ) car je peux créer plusieurs canaux avec le même ChannelFactory .

Cependant, j'ai une question concernant ce mécanisme de cache lorsqu'il s'agit de fermer ChannelFactory et Channel.

  1. Dois-je fermer la chaîne après son utilisation, à la fin de la demande, ou est-il acceptable de la laisser fermée (?) lorsque le contexte de cette demande disparaît?
  2. Qu'en est-il de ChannelFactory? Chaque canal étant associé à ChannelFactory qui l’a créé, est-il prudent de conserver le même ChannelFactory pendant la durée du processus d’application (AppDomain)?

C’est le code que j’utilise pour gérer ceci:

public class ServiceFactory
{
    private static Dictionary<string, object> ListOfOpenedChannels
    {
        get
        {
            if (null == HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"])
            {
                HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"] = new Dictionary<string, object>();
            }

            return (Dictionary<string, object>)HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"];
        }
        set
        {
            HttpContext.Current.Items[HttpContext.Current.Session.SessionID + "_ListOfOpenedChannels"] = value;
        }
    }

    public static T CreateServiceChannel<T>()
    {
        string key = typeof(T).Name;

        if (ListOfOpenedChannels.ContainsKey(key))
        {
            return (T)ListOfOpenedChannels[key];
        }
        else
        {
            ChannelFactory<T> channelF = new ChannelFactory<T>("IUsuarioService");
            T channel = channelF.CreateChannel();
            ListOfOpenedChannels.Add(key, channel);
            return channel;
        }
    }
}

Merci!

Était-ce utile?

La solution

Idéalement, fermez le canal dès que vous en avez terminé. Cela le replacera dans le pool de canaux afin qu'il puisse être utilisé par un autre thread de travail.

Oui, la fabrique de canaux (le bit coûteux) peut rester pendant toute la durée de vie de l'application.

Mettre à jour

A partir de .Net 4.5, des options de mise en cache sont intégrées pour les usines. Mise en cache de ChannelFactory .NET 4.5

Autres conseils

Ceci est un aparté. Pourquoi utilisez-vous SessionID comme clé de contexte? Le context.Items est unique par demande. C'est-à-dire:

HttpContext.Current.Items[HttpContext.Current.Session.SessionID +"_ListOfOpenedChannels"]

devrait être fonctionnellement équivalent à:

HttpContext.Current.Items["ListOfOpenedChannels"]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top