Я создаю серию служб WCF, которые будут использоваться более чем одним приложением. Из-за этого я пытаюсь определить общую библиотеку для доступа к службам WCF.
Зная, что каждый запрос на обслуживание, сделанный разными пользователями, должен использовать отдельный канал, я думаю, что он кеширует канал для каждого запроса (HttpContext.Current.Items
) и кеширует ChannelFactory, используемый для создания канала для приложения (HttpApplication.Items
), так как Я могу создать более одного канала с одинаковым ChannelFactory
.
Однако у меня есть вопрос относительно этого механизма кэширования, когда дело доходит до закрытия ChannelFactory и Channel.
- Нужно ли закрывать канал после его использования, в конце запроса, или можно оставить его там для закрытия (?), Когда контекст этого запроса умирает?
- А как насчет 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;
}
}
}
Спасибо!