Pregunta

Estoy creando una serie de servicios WCF que serán utilizados por más de una aplicación. Por eso estoy tratando de definir una biblioteca común para acceder a los servicios WCF.

Sabiendo que cada solicitud de servicio realizada por diferentes usuarios debe usar un canal diferente, estoy pensando en almacenar en caché el canal por solicitud ( HttpContext.Current.Items ) y almacenar en caché el ChannelFactory utilizado para crear el canal por aplicación ( HttpApplication.Items ) ya que puedo crear más de un canal con el mismo ChannelFactory .

Sin embargo, tengo una pregunta con respecto a este mecanismo de caché cuando se trata de cerrar ChannelFactory y Channel.

  1. ¿Necesito cerrar el canal después de usarlo, al final de la solicitud, o está bien dejarlo allí para que se cierre (?) cuando el contexto de esa solicitud muere?
  2. ¿Qué pasa con ChannelFactory? Dado que cada canal está asociado con ChannelFactory que lo creó, ¿es seguro mantener el mismo ChannelFactory durante la vida del proceso de aplicación (AppDomain)?

Este es el código que estoy usando para administrar esto:

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

¡Gracias!

¿Fue útil?

Solución

Lo ideal es cerrar el canal tan pronto como haya terminado con él. Esto lo colocará nuevamente en el grupo de canales para que pueda ser utilizado por otro subproceso de trabajo.

Sí, la fábrica de canales (el bit caro) puede permanecer durante toda la vida útil de la aplicación.


Actualizar

A partir de .Net 4.5 hay opciones de almacenamiento en caché incorporadas para las fábricas ChannelFactory Caching .NET 4.5

Otros consejos

Esto es un aparte. ¿Por qué estás usando SessionID como clave de contexto? El contexto. Los artículos son únicos por solicitud. Es decir:

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

debería ser funcionalmente equivalente a:

HttpContext.Current.Items["ListOfOpenedChannels"]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top