Настройка конфигурации Binding и Endpoint в коде - это один из способов, но есть другой способ использовать потребительскую DLL и оставить конфигурацию в существующем файле App.config.
Причина, по которой возникает упомянутое InvalidOperationException , заключается в том, что в DLL нет параметров конфигурации. Он всегда полагается на App.config, чтобы обеспечить его, но, поскольку вы используете DLL в другом консольном приложении, он не находит параметры конфигурации.
Когда мы используем диалоговое окно «Добавить ссылку на службу» для добавления веб-службы к клиентскому компоненту и создания экземпляра веб-службы, мы позволяем Visual Studio обрабатывать создание канала связи и загружать параметр конфигурации. Так что, если мы мы можем создать такой канал самостоятельно, тогда мы сможем управлять настройками конфигурации.
Microsoft предоставляет классы для этой цели, ConfigurationChannelFactory<TChannel>
Класс - один. MSDN заявляет:
Предоставляет общие функциональные возможности для создания элемента конфигурации канала для определенного типа.
ConfigurationChannelFactory позволяет централизованно управлять конфигурацией клиента WCF.
Используйте диалоговое окно «Добавить ссылку на службу», чтобы добавить веб-службу к клиентскому компоненту, так как нам нужен экземпляр интерфейса служебного канала.
Сначала переименуйте созданный файл App.config в App.dll.config и в его Свойствах файла измените Копировать в Выходной каталог свойство в Копировать всегда
Создайте класс, у которого есть метод, который возвращает объект Channel для доступа к веб-службе, например:
public class ManageService
{
public static T CreateServiceClient<T>(string configName)
{
string _assemblyLocation = Assembly.GetExecutingAssembly().Location;
var PluginConfig = ConfigurationManager.OpenExeConfiguration(_assemblyLocation);
ConfigurationChannelFactory<T> channelFactory = new ConfigurationChannelFactory<T>(configName, PluginConfig, null);
var client = channelFactory.CreateChannel();
return client;
}
}
Поскольку мы установили свойство Copy Always VS, копируем DLL проекта, а также файл App.dll.config в папку bin . Assembly.GetExecutingAssembly().Location
вернуть место сборки и ConfigurationManager.OpenExeConfiguration
Открывает указанный файл конфигурации клиента как объект конфигурации.
PluginConfig
содержит файл конфигурации App.Config Object, а ConfigurationChannelFactory<T>
использует его для связи со службой.
Этот метод можно вызвать, передав объект интерфейса служебного канала следующим образом:
Client = ManageService.CreateServiceClient<SampleService.IKeyServiceChannel>("MetadataExchangeTcpBinding_IKeyService");
SampleService
- это пространство имен моего веб-сервиса. Client
содержит экземпляр веб-службы.
Если вам нужно обработать Duplex Communication и Callbacks, тогда вы можете посмотреть на ConfigurationDuplexChannelFactory<TChannel>
Class.