Pergunta

Estou construindo uma série de serviços WCF que estão indo para ser usado por mais de um aplicativo. Por causa disso eu estou tentando definir uma biblioteca comum de serviços de acesso WCF.

sabendo que cada solicitação de serviço feitas por diferentes usuários devem usar um canal I diferente estou pensando no cache do Canal per-request (HttpContext.Current.Items) e cache do ChannelFactory usado para criar o canal por Aplicação (HttpApplication.Items) desde que eu posso criar mais de um canal com o mesmo ChannelFactory.

No entanto, eu tenho uma pergunta sobre este mecanismo de cache quando se trata de fechar o ChannelFactory e Channel.

  1. que eu preciso para fechar o Canal após ter sido utilizado, no final do pedido, ou é ok para deixá-lo lá para ser fechado (?) Quando o contexto do que morre pedido?
  2. Que tal ChannelFactory? Uma vez que cada canal está associado com o ChannelFactory que o criou, é seguro para manter o mesmo ChannelFactory durante a vida do processo de aplicação (AppDomain)?

Este é o código que estou usando para gerir este:

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

Obrigado!

Foi útil?

Solução

O ideal é fechar o canal, logo que você é feito com ele. Isso vai colocá-lo de volta para a piscina canal para que ele possa ser usado por outro segmento de trabalho.

Sim, a fábrica de canais (a pouco caros) podem permanecer por toda a vida útil da aplicação.


Atualização

A partir de .Net 4.5 há um construído em cache opções para fábricas ChannelFactory Caching .NET 4.5

Outras dicas

Este é um aparte. Por que você está usando SessionID como uma chave de contexto? Os Context.Items é único por pedido. Ou seja:

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

deve ser funcionalmente equivalente a:

HttpContext.Current.Items["ListOfOpenedChannels"]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top