代码之家  ›  专栏  ›  技术社区  ›  tucaz

ASP.NET客户端应用程序中的WCF通道工厂和通道缓存

  •  6
  • tucaz  · 技术社区  · 15 年前

    我正在构建一系列将由多个应用程序使用的WCF服务。因此,我试图定义一个公共库来访问WCF服务。

    我知道不同用户提出的每个服务请求应该使用不同的通道,所以我在缓存每个请求的通道。( HttpContext.Current.Items )并缓存用于为每个应用程序创建通道的通道工厂( HttpApplication.Items )因为我可以用相同的 ChannelFactory .

    但是,在关闭ChannelFactory和Channel时,我有一个关于这个缓存机制的问题。

    1. 在使用完频道后,在请求结束时,是否需要关闭频道,或者是否可以将其保留在关闭状态(?)当请求的上下文终止时?
    2. ChannelFactory怎么样?由于每个通道都与创建它的ChannelFactory相关联,在应用程序进程(AppDomain)的生命周期内保持相同的ChannelFactory是否安全?

    这是我用来管理这个的代码:

    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 年前
        1
  •  8
  •   MattC    8 年前

    理想情况下,完成后立即关闭通道。这将把它放回通道池,以便其他工作线程可以使用它。

    是的,通道工厂(昂贵的位)可以在应用程序的生命周期中保留。


    更新

    从.NET 4.5开始,工厂有一个内置的缓存选项 ChannelFactory Caching .NET 4.5

        2
  •  1
  •   Frank    15 年前

    这是一个旁白。为什么使用sessionid作为上下文键?每个请求的context.items都是唯一的。即:

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

    应在功能上等同于:

    HttpContext.Current.Items["ListOfOpenedChannels"]