在代码中设置 Binding 和 Endpoint 配置是一种方法,但还有另一种方法可以使用使用者 DLL 并让配置保留在现有的 App.config 文件中.
出现上述InvalidOperationException的原因是DLL中不包含配置设置。它总是依赖 App.config 来提供它,但由于您在另一个控制台应用程序中使用 DLL,它找不到配置设置。
当我们使用“添加服务引用”对话框将 Web 服务添加到客户端组件并创建 Web 服务实例时,我们让 Visual Studio 处理通信通道的创建并加载配置设置。所以,如果我们能够明确地创建我们自己的此类通道,然后我们可以管理配置设置。
Microsoft 为此提供了 Classes,ConfigurationChannelFactory<TChannel> Class 就是其中之一。 MSDN 状态:
提供通用功能来为特定类型创建通道配置元素。
ConfigurationChannelFactory 允许集中管理 WCF 客户端配置。
使用“添加服务引用”对话框将 Web 服务添加到客户端组件,因为我们需要服务通道接口实例。
首先将生成的 App.config 文件重命名为 App.dll.config 并在其文件属性中更改 复制到输出目录属性以始终复制
创建一个类,该类具有返回 Channel 对象以访问 Web Service 的方法,例如:
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 配置文件对象,ConfigurationChannelFactory<T> 使用它与服务通信。
可以通过传递您的服务通道接口对象来调用此方法,如下所示:
Client = ManageService.CreateServiceClient<SampleService.IKeyServiceChannel>("MetadataExchangeTcpBinding_IKeyService");
SampleService 是我的 Web 服务的命名空间。 Client 持有 Web Service 的实例。
如果你需要处理双工通信和回调,那么你可以看看ConfigurationDuplexChannelFactory<TChannel> Class。