Domanda

Sto creando una serie di servizi WCF che verranno utilizzati da più di un'applicazione. Per questo motivo sto cercando di definire una libreria comune per accedere ai servizi WCF.

Sapendo che ogni richiesta di servizio fatta da utenti diversi dovrebbe usare un canale diverso, sto pensando nella cache del canale per richiesta ( HttpContext.Current.Items ) e memorizza nella cache la ChannelFactory utilizzata per creare il canale per applicazione ( HttpApplication.Items ) poiché posso creare più di un canale con lo stesso ChannelFactory .

Tuttavia, ho una domanda su questo meccanismo di cache quando si tratta di chiudere ChannelFactory e Channel.

  1. Devo chiudere il canale dopo che è stato utilizzato, alla fine della richiesta, oppure è giusto lasciarlo lì per essere chiuso (?) quando il contesto di quella richiesta muore?
  2. Che dire di ChannelFactory? Poiché ogni canale è associato a ChannelFactory che lo ha creato, è sicuro mantenere lo stesso ChannelFactory durante la vita del processo dell'applicazione (AppDomain)?

Questo è il codice che sto usando per gestirlo:

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;
        }
    }
}

Grazie!

È stato utile?

Soluzione

Idealmente chiudi il canale non appena hai finito. Questo lo riporterà nel pool di canali in modo che possa essere utilizzato da un altro thread di lavoro.

Sì, la factory del canale (il bit costoso) può rimanere per tutta la durata dell'applicazione.


Aggiornamento

A partire da .Net 4.5 esistono opzioni di memorizzazione nella cache integrate per le fabbriche ChannelFactory Caching .NET 4.5

Altri suggerimenti

Questo è un lato. Perché stai usando SessionID come chiave di contesto? Il context.Items è unico per richiesta. Cioè:

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

dovrebbe essere funzionalmente equivalente a:

HttpContext.Current.Items["ListOfOpenedChannels"]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top