Je suis en train de convertir un .NET Remoting application de la WCF. À la fois de serveur et de client commun de l'interface et tous les objets sont activé par le serveur d'objets. Dans WCF monde, ce serait semblable à la création par appel de service et à l'aide de ChannelFactory créer un proxy. Je suis un peu en difficulté avec la façon de créer correctement ChannelFactory pour ASP .NET client. Pour des raisons de performances, je veux cache ChannelFactory objets et créer canal à chaque fois que j'appel le service. Dans .NET remoting jours, il RemotingConfiguration.GetRegisteredWellknownClientTypes méthode pour obtenir une collection d'objets client que j'ai pu ensuite en cache. Il apparaît, dans WCF monde il n'y a pas une telle chose, bien que j'ai été en mesure d'obtenir une collection de points de terminaison du fichier de configuration.
Maintenant, voici ce que je pense de travail. Je peux créer quelque chose comme ceci:
public static ProxyHelper
{
static Dictionary<Type, object> lookup = new Dictionary<string, object>();
static public T GetChannel<T>()
{
Type type = typeof(T);
ChannelFactory<T> factory;
if (!lookup.ContainsKey(type))
{
factory = new ChannelFactory<T>();
lookup.Add(type, factory);
}
else
{
factory = (ChannelFactory<T>)lookup[type];
}
T proxy = factory.CreateChannel();
((IClientChannel)proxy).Open();
return proxy;
}
}
Je pense que le code ci-dessus fonctionne, mais je suis un peu inquiet au sujet de plusieurs threads tentent d'ajouter de nouveaux ChannelFactory objet, si ce n'est pas dans la recherche. Depuis que j'utilise .NET 4.0, je pensais à l'aide de ConcurrentDictionary de la classe et de l'utilisation GetOrAdd() la méthode ou l'utilisation TryGetValue() la méthode d'abord pour vérifier si ChannelFactory existe et il n'existe pas, alors utilisez GetOrAdd() la méthode. Pas sûr au sujet de la performance mais de ConcurrentDictionary.TryGetValue() et ConcurrentDictionary.GetOrAdd() la méthode.
Un autre petit question est de savoir si j'ai besoin d'appeler ChannelFactory.La méthode Close() sur le canal de l'usine objets après l'ASP .NET application se termine, ou puis-je juste laisser .NET framework disposer le canal de l'usine d'objets sur son propre. Le proxy canal sera toujours fermé après l'appel de service, en utilisant la méthode ((IChannel)proxy).Close()
méthode.