Я создаю серию служб WCF, которые будут использоваться более чем одним приложением. Из-за этого я пытаюсь определить общую библиотеку для доступа к службам WCF.
Зная, что каждый сервисный запрос, сделанный разными пользователями, должен использовать другой канал, я думаю, что кэширую Channel per-request (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;
}
}
}
Спасибо!