WCF ChannelFactory и кеширование каналов в клиентском приложении ASP.NET - PullRequest
6 голосов
/ 01 декабря 2009

Я создаю серию служб WCF, которые будут использоваться более чем одним приложением. Из-за этого я пытаюсь определить общую библиотеку для доступа к службам WCF.

Зная, что каждый запрос на обслуживание, сделанный разными пользователями, должен использовать отдельный канал, я думаю, что он кеширует канал для каждого запроса (HttpContext.Current.Items) и кеширует ChannelFactory, используемый для создания канала для приложения (HttpApplication.Items), так как Я могу создать более одного канала с одинаковым ChannelFactory.

Однако у меня есть вопрос относительно этого механизма кэширования, когда дело доходит до закрытия ChannelFactory и Channel.

  1. Нужно ли закрывать канал после его использования, в конце запроса, или можно оставить его там для закрытия (?), Когда контекст этого запроса умирает?
  2. А как насчет ChannelFactory? Поскольку каждый канал связан с созданным им ChannelFactory, безопасно ли сохранять тот же ChannelFactory в течение всего жизненного цикла процесса приложения (AppDomain)?

Это код, который я использую для управления этим:

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

Спасибо!

Ответы [ 2 ]

8 голосов
/ 01 декабря 2009

В идеале закройте канал, как только закончите. Это поместит его обратно в пул каналов, чтобы его мог использовать другой рабочий поток.

Да, фабрика каналов (дорогой бит) может оставаться в течение всего срока службы приложения.


Обновление

Начиная с .Net 4.5 есть встроенные опции кеширования для фабрик. ChannelFactory Caching .NET 4.5

1 голос
/ 03 марта 2010

Это в стороне. Почему вы используете SessionID в качестве ключа контекста? Context.Items является уникальным для каждого запроса. То есть:

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

должно быть функционально эквивалентно:

HttpContext.Current.Items["ListOfOpenedChannels"]
...