我正在构建一系列将由多个应用程序使用的 WCF 服务。因此,我正在尝试定义一个通用库来访问 WCF 服务。
知道不同用户发出的每个服务请求应该使用不同的 Channel,我正在考虑缓存每个请求的 Channel (
HttpContext.Current.Items
) 并缓存用于为每个应用程序创建通道的 ChannelFactory (HttpApplication.Items
),因为我可以创建多个具有相同 ChannelFactory
的频道。
但是,在关闭 ChannelFactory 和 Channel 时,我对这个缓存机制有疑问。
这是我用来管理这个的代码:
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;
}
}
}
谢谢!
最好在完成后立即关闭通道。 这会将其放回到通道池中,以便另一个工作线程可以使用它。
是的,通道工厂(昂贵的部分)可以在应用程序的整个生命周期中保留。
从 .Net 4.5 开始,有一个内置的工厂缓存选项 ChannelFactory 缓存.NET 4.5
这是一个旁白。 为什么使用 SessionID 作为上下文键? 每个请求的 context.Items 都是唯一的。 那就是:
HttpContext.Current.Items[HttpContext.Current.Session.SessionID +"_ListOfOpenedChannels"]
在功能上应该等同于:
HttpContext.Current.Items["ListOfOpenedChannels"]