6

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

知道不同用户发出的每个服务请求都应该使用不同的通道,我正在考虑缓存每个请求的通道(HttpContext.Current.Items)并缓存用于为每个应用程序创建通道的 ChannelFactory(HttpApplication.Items),因为我可以使用一样ChannelFactory

但是,在关闭 ChannelFactory 和 Channel 时,我对这种缓存机制有疑问。

  1. 我是否需要在使用通道后、请求结束时关闭通道,或者当该请求的上下文消失时是否可以将其关闭(?)?
  2. 通道工厂呢?由于每个通道都与创建它的 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;
        }
    }
}

谢谢!

4

2 回答 2

8

理想情况下,一旦你完成它就关闭通道。这会将其放回通道池中,以便其他工作线程可以使用它。

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


更新

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

于 2009-12-01T12:52:50.673 回答
1

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

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

在功能上应该等同于:

HttpContext.Current.Items["ListOfOpenedChannels"]
于 2010-03-03T16:00:00.120 回答