Question

J'ai un service Windows qui utilise un système de plugin. J'utilise le code suivant dans la classe de base du plugin pour fournir une configuration distincte par DLL (donc il se lira à partir de plugin.dll.config):

string dllPath = Assembly.GetCallingAssembly().Location;
return ConfigurationManager.OpenExeConfiguration(dllPath);

Ces plugins doivent passer des appels aux services WCF, donc le problème que je rencontre est que new ChannelFactory<>("endPointName") Il n'y a que dans l'application hébergée app.config pour la configuration de point de terminaison.

Existe-t-il un moyen de simplement dire au canalfactory de regarder dans un autre fichier de configuration ou d'injecter en quelque sorte mon Configuration objet?

La seule façon dont je peux penser à aborder ceci est de créer manuellement un objet de point final et de liaison à partir de valeurs lues à partir de plugin.dll.config et les transmettre à l'un des ChannelFactory<> surcharge. Cela semble vraiment recréer la roue, et cela pourrait devenir vraiment désordonné avec un point final qui fait un usage intensif du comportement et des configurations de liaison. Peut-être existe-t-il un moyen de créer facilement des objets de point de terminaison et de liaison en le faisant passer une section de configuration?

Était-ce utile?

La solution

Il y a 2 options.

Option 1. Travailler avec les canaux.

Si vous travaillez directement avec les canaux, .NET 4.0 et .NET 4.5 ConfigurationChanelfactory. L'exemple sur MSDN ressemble à ça:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = "Test.config";
Configuration newConfiguration = ConfigurationManager.OpenMappedExeConfiguration(
    fileMap,
    ConfigurationUserLevel.None);

ConfigurationChannelFactory<ICalculatorChannel> factory1 = 
    new ConfigurationChannelFactory<ICalculatorChannel>(
        "endpoint1", 
        newConfiguration, 
        new EndpointAddress("http://localhost:8000/servicemodelsamples/service"));
ICalculatorChannel client1 = factory1.CreateChannel();

Comme indiqué par Langdon, vous pouvez utiliser l'adresse de point de terminaison à partir du fichier de configuration en passant simplement null, comme ceci:

var factory1 = new ConfigurationChannelFactory<ICalculatorChannel>(
        "endpoint1", 
        newConfiguration, 
        null);
ICalculatorChannel client1 = factory1.CreateChannel();

Ceci est discuté dans le MSDN Documentation.

Option 2. Travailler avec des proxys.

Si vous travaillez avec des proxys générés par le code, vous pouvez lire le fichier de configuration et charger un ServiceModelSectionGroup. Il y a un peu plus de travail impliqué que simplement utiliser le ConfigurationChannelFactory Mais au moins, vous pouvez continuer à utiliser le proxy généré (qui sous le capot utilise un ChannelFactory et gère le IChannelFactory pour toi.

Pablo Cibraro en montre un bel exemple ici: Obtenir des liaisons et des comportements WCF à partir de n'importe quelle source de configuration

Autres conseils

Utilisez un appdomain séparé pour chaque plugin. Lorsque vous créez l'approche, vous pouvez spécifier un nouveau fichier de configuration.

Voir http://msdn.microsoft.com/en-us/library/system.appdomainpup.configurationfile.aspx

Voici une solution que j'ai trouvée à ma deuxième question ... quelqu'un a mis le travail pour lire toutes les données de ServiceModelSectionGroup et créer un ChannelFactory.

http://weblogs.asp.net/cibrax/archive/2007/10/19/loading-the-wcf-configuration-from-different-files-on-the-client-side.aspx

J'utiliserai la solution de Richard, car cela semble beaucoup plus propre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top